我有一个字符串:
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
什么是更好的方式?
答案 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)}