只在Ruby中将特定子字符串推送到数组

时间:2013-10-12 04:11:22

标签: ruby arrays

我有一个数组,我正在循环并将特定值推送到一个单独的数组。 EX:

first_array = ["Promoter: 8", "Passive: 7"]

我想将每个整数值推送到一个单独的数组,最后看起来像这样:

final_array = [8,7]

新数组中的值为整数会很好。我想不出将字符串中的所有数值推送到新数组的方法,但是做出我想要的最佳选择是什么?

5 个答案:

答案 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τ

  • τ - 开头和结尾字符
  • m - 表示#map
  • B - 意味着采取阻止
  • 2 - 表示数组的前3个元素
  • d - 表示除第一个之外的所有元素(与#cdr,btw中的含义相同)。

因此,在#τ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使用m2字符映射(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再次表示#mapb表示接受第二个元素,ti表示将其转换为{{ 1}}:

Integer

答案 4 :(得分:0)

如果每个字符串的整数部分(看起来像哈希的成员)总是至少有一个空格,并且没有其他空格(除了可能在字符串的开头),你可以做这样:

first_array = ["Promoter: 8", "Passive: 7"]
Hash[*first_array.map(&:split).flatten].values.map(&:to_i) # => [8,7]
  • map first_array =&gt; [[“Promoter:”,“8”],[“被动:”,“7”]]
  • flatten =&gt; [“发起人:”,“8”,“被动:”,“7”]
  • 转换为hash =&gt; {“促销员:”=&gt; “8”,“被动:”=&gt; “7”}
  • 获取哈希值=&gt; [“8”,“7”]
  • 转换为ints =&gt; [8,7]

请注意splat的必要性:

 Hash[*["Promoter:", "8", "Passive:", "7"]]
   => Hash["Promoter:", "8", "Passive:", "7"]                                               
   => {"Promoter:" => "8", "Passive:" => "7"}