如何在Ruby中嵌套数组中求和?

Vis*_*har -2 ruby arrays multidimensional-array

我有这个数组:

array = [["R.M", 20], ["R.U-CS", 3], ["R.M-TIC", 3], ["R.J.CONF", 20]]
Run Code Online (Sandbox Code Playgroud)

我想要sum数值,所以我使用以下方法将其转换为单个数组flatten:

array = array.flatten
#=> ["R.M", 20, "R.U-CS", 3, "R.M-TIC", 3, "R.J.CONF", 20]
Run Code Online (Sandbox Code Playgroud)

然后:

a = []
array.each do |r|
  a << r if r.class == Fixnum
end
a 
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我正在寻找一个更简单的解决方案,可能首先将数组转换为"唯一numeric"数组:

[20, 3, 3, 20]
Run Code Online (Sandbox Code Playgroud)

Ste*_*fan 17

不是很明显,但您可以传递一个类或模块grep来选择它的实例:

array.grep(Integer)
#=> [20, 3, 3, 20]
Run Code Online (Sandbox Code Playgroud)

要么

array.grep(Numeric)
#=> [20, 3, 3, 20]
Run Code Online (Sandbox Code Playgroud)

或者grep_v为了排除其实例:

array.grep_v(String)
#=> [20, 3, 3, 20]
Run Code Online (Sandbox Code Playgroud)

这样做是因为grep使用===模式匹配.如果你传递一个类,它会调用Module#===(每个类都是一个模块),true如果该对象是接收者的一个实例,它将返回:

Integer === 20
#=> true

Integer === 'foo'
#=> false
Run Code Online (Sandbox Code Playgroud)

但是,您的实际问题可以更轻松地解决.给定这个数组:

array = [["R.M", 20], ["R.U-CS", 3], ["R.M-TIC", 3], ["R.J.CONF", 20]]
Run Code Online (Sandbox Code Playgroud)

假设第二个值始终是一个数字,您可以使用sum一个块:

array.sum { |string, number| number }
#=> 46
Run Code Online (Sandbox Code Playgroud)

或者对每个子数组的last值求和:(在这种情况下是相同的)

array.sum(&:last)
#=> 46
Run Code Online (Sandbox Code Playgroud)

  • @mudasobwa:有很多方法给猫皮肤:) (4认同)
  • 这个!我永远忘记了这个美妙的`grep`.**这是正确的答案,应该标记.** (2认同)