数组中的唯一元素

6
我想通过内部数组中的第一个元素从数组的数组中找到唯一的元素。
例如:
a = [[1,2],[2,3],[1,5]

我想要类似于的东西。
[[1,2],[2,3]]
2个回答

14

uniq方法需要一个块:

uniq_a = a.uniq(&:first)

如果您想原地进行操作:

a.uniq!(&:first)
例如:
>> a = [[1,2],[2,3],[1,5]]
=> [[1, 2], [2, 3], [1, 5]]
>> a.uniq(&:first)
=> [[1, 2], [2, 3]]
>> a
=> [[1, 2], [2, 3], [1, 5]]

或者

>> a = [[1,2],[2,3],[1,5]]
=> [[1, 2], [2, 3], [1, 5]]
>> a.uniq!(&:first)
=> [[1, 2], [2, 3]]
>> a
=> [[1, 2], [2, 3]]

如果你被困在 1.8.7 版本中,其中 uniq 不接受块参数,那么你可以这样做:

a.group_by(&:first).values.map(&:first)
例如:
>> a = [[1,2],[2,3],[1,5]]
=> [[1, 2], [2, 3], [1, 5]]
>> a.group_by(&:first).values.map(&:first)
=> [[1, 2], [2, 3]]

感谢Jin的额外催促。


1
注意:我在尝试1.8.7版本时,发现它不起作用,后来发现将块传递给uniq是在Ruby 1.9.2中添加的,如此处所述。http://rbjl.net/27-new-array-and-enumerable-methods-in-ruby-1-9-2-keep_if-chunk。 - Jin
1
@Jin:没错,我为你添加了一个1.8.7兼容版本 :) - mu is too short

1
这是一个 Ruby 1.8.7 的解决方案。
irb> [[1,2],[2,3],[1,5]].inject([]) { |memo,x| memo << x unless memo.detect { |item| item.first == x.first }; memo }
=> [[1, 2], [2, 3]]

你也可以采用哈希表的简写方式,有点懒就直接取最后一个元素

irb> [[1,2],[2,3],[1,5]].inject({}) { |memo,x| memo[x.first] = x; memo }.map { |x| x.last }
=> [[1, 5], [2, 3]]

类似于[[1,2],[2,3],[1,5]].inject({}) { |memo,x| memo[x.first] ||= x; memo }.values的东西将是另一个选项(因为我们只处理数组中的数字),并且可能比我花哨的1.8.7版本更快(当然速度差异并不重要)。 - mu is too short

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接