我有两个数组,每个数组都有许多数组元素。我想通过使用每个数组元素的第一个元素作为标识符来添加这两个元素,同时添加第二个元素,例如:
a1= [ [0,1], [1,5], [7,3] ]
a2= [ [0,3], [3,2], [1,7] ]
结果我想要(请注意,输入数组可能不会以任何方式排序):
[ [0,4], [1,12], [3,2], [7,3] ]
并且应该对结果进行排序。
我有两个数组,每个数组都有许多数组元素。我想通过使用每个数组元素的第一个元素作为标识符来添加这两个元素,同时添加第二个元素,例如:
a1= [ [0,1], [1,5], [7,3] ]
a2= [ [0,3], [3,2], [1,7] ]
结果我想要(请注意,输入数组可能不会以任何方式排序):
[ [0,4], [1,12], [3,2], [7,3] ]
并且应该对结果进行排序。
你可以这样做:
(a + b).group_by(&:first).map { |k, v| [k, v.map(&:last).inject(:+)] }
首先,您将数组与 + 放在一起,因为您不关心 a 和 b,您只关心它们的元素。然后 group_by 按第一个元素对组合数组进行分区,以便可以轻松使用内部数组。然后你只需要用 v.map(&:last) 提取内部数组的第二个(或最后一个)元素,然后用 inject(:+) 对它们求和。
例如:
>> a = [[1,10],[2,20],[3,30]]
>> b = [[1,50],[3,70]]
>> (a + b).group_by(&:first).map { |k,v| [k, v.map(&:last).inject(:+)] }
=> [[1, 60], [2, 20], [3, 100]]
依靠 The Mini John 对问题的解释:
(a1 + a2)
.inject([]) do |a, (i, n)|
a.push([i, 0]) unless a.assoc(i)
a.assoc(i)[1] += n
a
end
.sort
# => [[0, 4], [1, 12], [3, 2], [7, 3]]
这在一次迭代中完成。