我有一个数组,我正在循环并将特定值推送到一个单独的数组。 EX:
first_array = ["Promoter: 8", "Passive: 7"]
我想将每个整数值推送到一个单独的数组,最后看起来像这样:
final_array = [8,7]
新数组中的值为整数会很好。我想不出将字符串中的所有数值推送到新数组的方法,但是做出我想要的最佳选择是什么?
答案 0 :(得分:2)
first_array.map{|s| s[/\d+/].to_i}
# => [8, 7]
答案 1 :(得分:1)
first_array.map{|a| a.match(/\d+/)}.compact.map{|a| a[0].to_i }
答案 2 :(得分:1)
我必须添加这个超短但复杂的单线解决方案:
a = ["Promoter: 8", "Passive: 7"]
p a.grep(/(\d+)/){$&.to_i} #=> [8,7]
答案 3 :(得分:1)
您提出的问题有一个简单实用的答案,已由其他人提供。但在我看来,你的字符串数组
a = ["Promoter: 8", "Passive: 7"]
羡慕是Hash
。因此,从更广泛的角度来看,我会首先自由地将其转换为哈希:
require 'pyper' # (type "gem install pyper" in your command line to install it)
hsh = Hash[ a.τBmm2dτ &/(\w+): *(\d+)/.method( :match ) ]
#=> {"Promoter"=>"8", "Passive"=>"7"}
# (The construction of #τBmm2dτ Pyper method will be explained in the appendix.)
现在,将输入数据放在哈希中,您可以更轻松地使用它们,例如。
hsh.τmbtiτ
#=> [8, 7]
附录:Pyper方法的说明。
Pyper方法类似于Lisp#car / #cdr方法,即组合 字母控制方法行为。在第一种方法中,#τBmm2dτ
:
因此,在#τBmm2dτ
中,Bm
按如下方式应用块:
x = ["Promoter: 8", "Passive: 7"].map &/(\w+): *(\d+)/.method( :match )
#=> [#<MatchData "Promoter: 8" 1:"Promoter" 2:"8">, #<MatchData "Passive: 7" 1:"Passive" 2:"7">]
# Which results in an array of 2 MatchData objects.
然后,m2d
chars使用m
和2
字符映射(d
)MatchData对象。字符2
给出了
x = x.map { |e| e.to_a.take 3 }
#=> [["Promoter: 8", "Promoter", "8"], ["Passive: 7", "Passive", "7"]]
和d
删除每个元素中的第一个元素:
x = x.map { |e| e.drop 1 }
#=> [["Promoter", "8"], ["Passive", "7"]]
在secon方法中,#τmbtiτ
,m
再次表示#map
,b
表示接受第二个元素,ti
表示将其转换为{{ 1}}:
Integer
答案 4 :(得分:0)
如果每个字符串的整数部分(看起来像哈希的成员)总是至少有一个空格,并且没有其他空格(除了可能在字符串的开头),你可以做这样:
first_array = ["Promoter: 8", "Passive: 7"]
Hash[*first_array.map(&:split).flatten].values.map(&:to_i) # => [8,7]
请注意splat的必要性:
Hash[*["Promoter:", "8", "Passive:", "7"]]
=> Hash["Promoter:", "8", "Passive:", "7"]
=> {"Promoter:" => "8", "Passive:" => "7"}