Ruby 删除对象数组中的重复项

Ruby 删除对象数组中的重复项,ruby,Ruby,如何删除对象数组中的重复对象。 例如: [#< @a:1, @b:2>, #< @a:3, @b:3>, #<@a:3, @b:3>] => [ #< @a:1, @b:2>, #< @a:3, @b:3>]. [#,#,#]=>[#,#]。 我的理解是没有两个物体是一样的。如果我错了,请纠正我。使用。文档中的示例: a = [ "a", "a", "b", "b", "c" ] a.uniq # => ["a",

如何删除对象数组中的重复对象。 例如:

 [#< @a:1, @b:2>, #< @a:3, @b:3>, #<@a:3, @b:3>] => [ #< @a:1, @b:2>, #< @a:3, @b:3>]. 
[#<@a:1,@b:2>,#<@a:3,@b:3>,#]=>[#<@a:1,@b:2>,#<@a:3,@b:3>]。
我的理解是没有两个物体是一样的。如果我错了,请纠正我。

使用。文档中的示例:

a = [ "a", "a", "b", "b", "c" ]
a.uniq 
# => ["a", "b", "c"]
请注意,此方法使用它们的
hash
eql?
方法来识别重复项。这就是说:如果
uniq
不能像预期的那样工作,那么您可能需要确保
hash
eql?
得到了适当的实现。

您可以使用
数组#uniq
,但您需要对类做一些小的更改。根据,
uniq
“使用它们的
hash
eql?
方法比较值以提高效率”,因此您需要定义
hash
eql?
,以便它们将类中的两个对象标识为重复对象。例如,如果具有相同
a
b
属性的两个对象是重复的,则可以执行以下操作:

class Foo
  attr_reader :a, :b

  def initialize(a, b)
    @a, @b = a, b
  end

  def hash
    [ a, b ].hash
  end

  def eql?(other)
    hash == other.hash
  end
end

arr = [ Foo.new(1, 2), Foo.new(3, 3), Foo.new(3, 3) ]
p arr.uniq
# => [#<Foo:0x007f686ac36700 @a=1, @b=2>, #<Foo:0x007f686ac366b0 @a=3, @b=3>]

你可以在repl.it上看到。

很难知道你在问什么。尝试生成一个足够小的示例,我们可以运行它并理解您要做的事情。欢迎使用堆栈溢出。请阅读“”以及链接页面,以及“”。询问时,我们需要看到的不仅仅是数组的语法错误定义。我们还需要了解您尝试了什么,并解释为什么它不起作用。目前,您似乎没有尝试,您要求我们为您编写代码,因此努力的证据很重要。请参阅。您可能会提到,如果
Foo\eql?
Foo\Foo\hash
未定义,则
arr.uniq#=>arr
,在这种情况下和/或由
uniq
使用。
class Bar
  attr_reader :a, :b

  def initialize(a, b)
    @a, @b = a, b
  end
end

arr2 = [ Bar.new(1, 2), Bar.new(3, 3), Foo.new(3, 3) ]

p arr2.uniq {|obj| [ obj.a, obj.b ] }
# => [#<Bar:0x007fe80f7b6750 @a=1, @b=2>, #<Bar:0x007fe80f7b6700 @a=3, @b=3>]