-2

我有两个数组:

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 中是唯一的。

我该怎么做呢?

提前致谢,

4

5 回答 5

2

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]]。如果发生这种情况,您的问题中没有说明。

于 2013-06-26T15:17:10.243 回答
1

给定

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]]
于 2013-06-26T15:09:17.763 回答
1

这是一种可能性:

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]]
于 2013-06-26T15:10:07.667 回答
0
[*a, *b].group_by(&:first).map{|k, v| [k, v.map(&:last).inject(:+)]}
于 2013-06-26T15:40:54.340 回答
0

只需反转数组并调用唯一的:

(b + a).uniq(&:first)

这是有效的,因为Array#+它是Array#concat. 它将创建一个新的有序数组。无论哪个数组是第一个,都将在输出中优先。当uniq被调用时,它将按顺序枚举数组,允许您只获取第一列的第一个实例。

您可以对n数组执行此操作:

[b,d,c,a].reduce(&:+).uniq(&:first)
于 2013-06-26T16:43:59.590 回答