我有一个如下所示的数组:
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]]}
离我想要的输出还很远。
答案 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)
有时称为计算哈希。要了解其工作原理,请参阅,尤其是提供默认值作为新参数的效果的说明。简而言之,如果定义了哈希h = Hash.new(0)
,那么如果h
没有密钥k
,则h[k]
会返回默认值,此处为0
(和哈希没有改变。)