如何删除数组中具有重复项的对象

时间:2011-04-03 19:07:19

标签: ruby

  

可能重复:
  Remove from the array elements that are repeated. in Ruby

我想这样做:

my_array = [1, 1, 2, 2, 3]
my_array_without_duplicates = [3]

调用my_array.uniq会给我[1, 2, 3],这不是我想要的结果。有没有一种有效的方法呢?我现在正在做的事情太难看了。

3 个答案:

答案 0 :(得分:2)

my_array.group_by{|e| e}.select{|k,v| v.count == 1}.keys

my_array.select{|e| my_array.count(e) == 1}
顺便说一句,你可能意味着my_array = [1, 1, 2, 2, 3](括号,而不是大括号)。

答案 1 :(得分:0)

我首先得到输入的直方图(参见Enumerable#frequency或自己编写),然后选择:

require 'facets'
xs = [1, 1, 2, 2, 3]
fs = xs.frequency # {1=>2, 2=>2, 3=>1}
ys = xs.select { |x| fs[x] == 1 } # [3]

Ruby 1.9保持哈希顺序,所以这可能就足够了:

xs.frequency.select { |x, count| count == 1 }.keys # [3]

如果使用Enumerable#map_select抽象(假设输入中没有nil s),可以一步编写,如下所示:

xs.frequency.map_select { |x, count| x if count == 1 } # [3]

答案 2 :(得分:0)

我相信这在简单性和效率方面有很好的平衡。只是看起来很长,因为变量名很长。

my_array_without_duplicate = my_array.dup
my_array_without_duplicate.each_with_index {|e, i|
    my_array_without_duplicate.delete(e) if my_array_without_dupliate.index(e, i+1)}