Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用匹配元素对数组中的元素求和_Arrays_Ruby - Fatal编程技术网

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}