如何从Ruby数组中获取重复元素?

3

假设我有一个数组 [1,2,3,1,5,2]。 这里的1和2是重复的元素。我想得到一个新的数组[1,2]。

在Ruby中如何实现这个功能?


@mihai,谢谢,已投票关闭,现在您可以安全地删除您的答案。 - tokland
2个回答

12
arr = [1,2,3,1,5,2]
arr.group_by {|e| e}.map { |e| e[0] if e[1][1]}.compact

虽然不太好看,但可以解决n+1的问题。


4
也许更清晰的写法是 arr.group_by { |v| v }.select { |k, v| v.count > 1 }.keys。该代码段作用为将数组 arr 按元素进行分组,然后选出重复元素组成的组,并返回这些组中的元素。 - d11wtq
1
我最开始也是用了这一行代码,但是去掉了 .count 以减少每个元素的操作次数。 - Pavling

4
arr = [1,2,3,1,5,2]
arr.select { |x| arr.count(x) > 1 } .uniq

使用reduce的长解决方案应该更快。

arr.reduce [{}, []] do |(seen, out), cur|
  case seen[cur]
    when :seen then
      [seen.merge({cur => :added}), out << cur]
    when :added then
      [seen, out]
    else
     [seen.merge({cur => :seen}), out]
  end
end.last

我在重复的问题中写了类似的东西:https://dev59.com/kkfRa4cB1Zd3GeqP8Fbp#8459032。但我看到这里有一些问题:1)你正在使用一个数组对象来测试包含,这是O(n),散列或集合更合适。 2)您可以安全地删除uniq。 3)使用参数扩展而不是acc[0]/acc[1]。 - tokland
@tokland,感谢您的评论。1)我已经切换到Hash。2)不幸的是不行。请看 [1,1,1]。3)好点子! - Jan
最近一次更改后,“uniq”不再必要。 - Jan
1
你说得对!现在我需要检查我的解决方案。 - tokland

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