2

我有一个这样的数组:

array = ["john-56", "admin-57", "duke-58", "duke-65", 
         "john-56", "admin-57", "roger-65", "roger-15"]

我只想保留重复的元素,在这种情况下我希望得到这个结果:

["admin-57","admin-57","john-56","john-56"]

我试过使用这样的keep_if方法:

array.keep_if { |x,y| x==y }

但它是array空的。

4

4 回答 4

3

也许不是更有效,而是一行:

array.select { |x| array.count(x) == 2 }.uniq

@edit(感谢 Jounty)

如果您的值可以出现两次以上

array.select { |x| array.count(x) > 1 }.uniq
于 2013-08-08T10:41:16.370 回答
3

Array#keep_if仅在迭代中传递当前元素。

你可以使用:

duplicates = array.keep_if { |x| array.count(x) > 1 }.uniq

或者:

duplicates = array.uniq | array

于 2013-08-08T10:46:56.400 回答
1

为了效率起见,先将它们全部计数,然后根据计算的计数过滤它们

array = %w[ john-56 admin-57 duke-58  duke-65
            john-56 admin-57 roger-65 roger-15 ]

begin
  counts = {}
  array.each { |name| counts[name] = counts[name].to_i + 1 }
  array.keep_if { |name| counts[name] > 1 }
end

p array

输出

["john-56", "admin-57", "john-56", "admin-57"]

或者,如果您不希望过滤后的元素出现多次,请编写

begin
  counts = {}
  array.each { |name| counts[name] = counts[name].to_i + 1 }
  array = counts.select { |k, v| v > 1 }.keys
end

p array

输出

["john-56", "admin-57"]
于 2013-08-08T11:38:18.937 回答
1
array = %w[ 
  john-56   admin-57 
  duke-58   duke-65
  john-56   admin-57 
  roger-65  roger-15 
]

counts = Hash.new(0)
array.each {|name| counts[name] += 1}

results = []
counts.each do |key, count|
  results += [key]*count if count > 1
end

p results

--output:--
["john-56", "john-56", "admin-57", "admin-57"]
于 2013-08-08T11:58:18.313 回答