Arrays 使用匹配元素对数组中的元素求和
我有一个如下所示的数组:Arrays 使用匹配元素对数组中的元素求和,arrays,ruby,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] &
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]]}
它仍然离我想要的输出很远。这里有一种方法可以返回一个新的数组数组,其中每个数组的第一个元素是原始数组的第一个元素的总和,其中第二个和第三个元素匹配:
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]]
希望这有帮助 这将使用数组分组而不是组合后两个数字产生类似的结果
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
注意
original.each_with_object(Hash.new(0)) { |(f,*rest),h| h[rest] += f }
#=> {[2, 3]=>4, [2, 2]=>5, [4, 2]=>5}
散列。新的(0)
有时称为计数散列。要了解其工作原理,请参见,特别是解释提供默认值作为new参数的效果。简而言之,如果定义了哈希值h=hash.new(0)
,那么如果h
没有键k
,h[k]
返回默认值,这里是0
(哈希值没有改变)。我想你可以使用字典。@alanfcm我用我尝试过的方法更新了我的原始帖子。谢谢你的兴趣Hanks@zeet,你是个天才,我真的很感谢你的贡献……我想你所做的一切离你想要的并不远,你所要做的就是添加每个子数组的第一个元素,对吗?谢谢你们的建议和免费英语课。我很感激。谢谢,@Zoran!!到目前为止,这完全符合我的需要!!非常感谢你!很高兴能帮上忙:)谢谢!我会调查新的
original.each_with_object(Hash.new(0)) { |(f,*rest),h| h[rest] += f }
#=> {[2, 3]=>4, [2, 2]=>5, [4, 2]=>5}