从Ruby Array获取2次或更多次的项目

时间:2015-01-16 22:59:21

标签: ruby

我们说我有一个Ruby数组。

[1,2,3,4,4,5,6,6,7,7]

我想找到2次或更多次出现的值。

[4,6,7]

这将有助于我的流程首先确定哪些项目只发生一次,然后删除它们。所以我想首先找到一次出现的项目来解决这个问题。

4 个答案:

答案 0 :(得分:5)

可能有更好的方法,但这是一个:

> [1,2,3,4,4,5,6,6,7,7].group_by{|i| i}.reject{|k,v| v.size == 1}.keys
=> [4, 6, 7]

打破它:

> a = [1,2,3,4,4,5,6,6,7,7]
=> [1, 2, 3, 4, 4, 5, 6, 6, 7, 7]
> a1 = a.group_by{|i| i}
=> {1=>[1], 2=>[2], 3=>[3], 4=>[4, 4], 5=>[5], 6=>[6, 6], 7=>[7, 7]}
> a2 = a1.reject{|k,v| v.size == 1}
=> {4=>[4, 4], 6=>[6, 6], 7=>[7, 7]}
> a2.keys
=> [4, 6, 7]

答案 1 :(得分:3)

每个人都非常难以遵循一个班轮:)

[1,2,3,4,4,5,6,6,7,7].each_with_object(Hash.new(0)) { |o, h| h[o] += 1 }.select { |_, v| v > 1 }.keys

添加一些空格和一些注释

[1,2,3,4,4,5,6,6,7,7].each_with_object(Hash.new(0)) { |o, h| 
  h[o] += 1 
}.select { |_, v| 
  v > 1 
}.keys
  • 枚举并传入我们的备忘录哈希到每次迭代,哈希默认为0任意键
  • 对象的增量计数器
  • 仅选择值大于1的键值对
  • 抓住钥匙

这看起来非常类似于Phillip的简洁答案 - 理论上这应该使用稍少的内存,因为它不需要构建中间数组来执行计数

答案 2 :(得分:1)

另一种方式:

a = [1,2,3,4,4,5,6,6,7,7]
au = a.uniq
a.reject { |i| au.delete(i) }
  #=> [4, 6, 7]

如果效率很重要,可以使用一套:

require 'set'

s = Set.new
a.reject { |e| s.add?(e) }
  #=> [4, 6, 7]

答案 3 :(得分:0)

您可以使用Array#select返回Array#count大于1的元素:

2.1.2 :005 > arr = [1,2,3,4,4,5,6,6,7,7]
 => [1, 2, 3, 4, 4, 5, 6, 6, 7, 7]
2.1.2 :006 > arr.select { |e| arr.count(e) > 1 }.uniq
 => [4, 6, 7]

希望这有帮助