我想通过内部数组中的第一个元素从数组的数组中找到唯一的元素。
例如:
我想要类似于的东西。
例如:
a = [[1,2],[2,3],[1,5]
我想要类似于的东西。
[[1,2],[2,3]]
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的额外催促。
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
uniq
是在Ruby 1.9.2中添加的,如此处所述。http://rbjl.net/27-new-array-and-enumerable-methods-in-ruby-1-9-2-keep_if-chunk。 - Jin