我有两个数组:
a = [[1234,1],[2134,0],[4321,0],[2221,3]]
b = [[2134,1],[4321,3]]
我想根据a
以下结果的第一个元素合并它们:
c = [[1234,1],[2134,1],[4321,3],[2221,3]]
如果第一个元素匹配,我想用a
值替换 0。b
第一个元素在 a 和 b 中是唯一的。
我该怎么做呢?
提前致谢,
该Hash#merge
函数允许您指定一个块来定义如何处理这些值。
a = [[1234,1],[2134,0],[4321,0],[2221,3]]
b = [[2134,1],[4321,3]]
c = Hash[a].merge(Hash[b]) { |key, old, new| old+new }.to_a
# => [[1234, 1], [2134, 1], [4321, 3], [2221, 3]]
请参阅Hash#merge
文档。
在这种情况下,我通过构建值的总和来进行合并。您可能想要选择最大的价值,或其他适合您的策略。
免责声明:a
如果(或b
)包含具有相同第一个值的数组,则此方法不起作用。例子[[1, 1], [1, 4], [2, 8]]
。如果发生这种情况,您的问题中没有说明。
给定
a = [[1234,1],[2134,0],[4321,0],[2221,3]]
和
b = [[2134,1],[4321,3]]
您可以将这些数组转换为哈希,执行合并,然后再次将结果转换为数组。
Hash[a].merge(Hash[b]).to_a
#=> [[1234, 1], [2134, 1], [4321, 3], [2221, 3]]
这是一种可能性:
a = [[1234,1],[2134,0],[4321,0],[2221,3]]
b = [[2134,1],[4321,3]]
a.zip(b).flatten(1).uniq(&:first)
# => [[1234, 1], [2134, 1], [4321, 3], [2221, 3]]
[*a, *b].group_by(&:first).map{|k, v| [k, v.map(&:last).inject(:+)]}
只需反转数组并调用唯一的:
(b + a).uniq(&:first)
这是有效的,因为Array#+
它是Array#concat
. 它将创建一个新的有序数组。无论哪个数组是第一个,都将在输出中优先。当uniq
被调用时,它将按顺序枚举数组,允许您只获取第一列的第一个实例。
您可以对n
数组执行此操作:
[b,d,c,a].reduce(&:+).uniq(&:first)