将字符串转换为数组

时间:2018-03-18 03:29:42

标签: arrays ruby

我有一个字符串:

key = "41521"

我想把它转换成这样的数组:

array = [41, 15, 52, 21]

我这样做了:

array = []
array << key[0..1].to_i
array << key[1..2].to_i
array << key[2..3].to_i
array << key[3..4].to_i

什么是更好的方式?

4 个答案:

答案 0 :(得分:6)

key = "41521"

key.each_char.each_cons(2).map { |a| a.join.to_i }
  #=> [41, 15, 52, 21]

key.gsub(/\d(?=(\d))/).with_object([]) { |s,a| a << (s<<$1).to_i }
  #=> [41, 15, 52, 21]

a = []
e = key.each_char
  #=> #<Enumerator: "41521":each_char>
loop { a << (e.next << e.peek).to_i }
a #=> [41, 15, 52, 21]

在#3 Enumerator#peek中,当枚举器的内部位置结束时,会引发StopInteration异常(除非key为空字符串,在这种情况下Enumerator#next引发StopInteration异常)。 Kernel#loop通过突破循环来处理异常。

答案 1 :(得分:2)

key.gsub(/(?<=.)\d(?=.)/, '\&\&').scan(/\d{2}/).map(&:to_i)
# => [41, 15, 52, 21]

(0...key.length).map{|i| key[i, 2].to_i}
# => [41, 15, 52, 21, 1]

答案 2 :(得分:1)

不像其他一些答案那么简短,但对我来说,更容易看到这些步骤:

arr = key.chars.each_with_index
         .reduce([]) {|s,(v,i)| s << (v + (key[i+1] || '')).to_i }
         .select {|s| s.to_s.length > 1 }

# arr: [41, 15, 52, 21]

答案 3 :(得分:0)

(0..(key.length-2)).map{|i| key.slice(i, 2)}