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>]