我们说我有一个Ruby数组。
[1,2,3,4,4,5,6,6,7,7]
我想找到2次或更多次出现的值。
[4,6,7]
这将有助于我的流程首先确定哪些项目只发生一次,然后删除它们。所以我想首先找到一次出现的项目来解决这个问题。
答案 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
任意键这看起来非常类似于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]
希望这有帮助