从具有匹配元素的数组求和元素

时间:2018-02-02 00:10:39

标签: arrays ruby

我有一个如下所示的数组:

original = [[1, 2, 3], [2, 2, 2], [1, 2, 3], [2, 2, 2], [2, 2, 3], [1, 2, 2], [5, 4, 2]]

我想得到一个新的数组,其元素与第二和第三位置相匹配,总结其第一个位置来得到这个:

expected_output = [[4, 2, 3], [5, 2, 2], [5, 4, 2]]

我必须按如下方式对数组中的元素进行分组:

new_array = original.group_by {|n| n[1] && n[2] }
# => {3=>[[1, 2, 3], [1, 2, 3], [2, 2, 3]], 2=>[[2, 2, 2], [2, 2, 2], [1, 2, 2], [5, 4, 2]]}

离我想要的输出还很远。

3 个答案:

答案 0 :(得分:2)

这是返回一个新数组的一种方法,其中每个数组的第一个元素是原始数组的第一个元素的总和,其中第二个和第三个元素匹配:

arr = [[1, 2, 3], [2, 2, 2], [1, 2, 3], [2, 2, 2], [2, 2, 3], [1, 2, 2], [5, 4, 2]]

array_groups = arr.group_by { |sub_arr| sub_arr[1, 2] }

result = array_groups.map do |k, v|
  k.unshift(v.map(&:first).inject(:+))
end

result
# => [[4, 2, 3], [5, 2, 2], [5, 4, 2]]

希望这有帮助!

答案 1 :(得分:1)

这将使用数组分组产生类似的结果,而不是组合后两个数字。

original = [[1, 2, 3], [2, 2, 2], [1, 2, 3], [2, 2, 2], [2, 2, 3], [1, 2, 2], [5, 4, 2]]
new = original.group_by {|n| [n[1], n[2]] }
added = new.map{|x| [new[x.first].map(&:first).inject(0, :+),x.first].flatten}
puts added.to_s

答案 2 :(得分:0)

original.each_with_object(Hash.new(0)) { |(f,*rest),h| h[rest] += f }.
         map { |(s,t),f| [f,s,t] }
  # => [[4, 2, 3], [5, 2, 2], [5, 4, 2]]

请注意

original.each_with_object(Hash.new(0)) { |(f,*rest),h| h[rest] += f }
  #=> {[2, 3]=>4, [2, 2]=>5, [4, 2]=>5}

Hash.new(0)有时称为计算哈希。要了解其工作原理,请参阅enter image description here,尤其是提供默认值作为新参数的效果的说明。简而言之,如果定义了哈希h = Hash.new(0),那么如果h没有密钥k,则h[k]会返回默认值,此处为0(和哈希没有改变。)