Collections 重复项目集

Collections 重复项目集,collections,kotlin,Collections,Kotlin,在Kotlin中,我有一个数据类的MutableSet。数据类不重写equals()或hashCode()。我在集合中遇到了涉及重复对象的bug,我注意到调用foo.containsAll(foo)会返回集合的false 我检查了集合中的每个项目,只有少数返回foo.contains(foo.toList()[I])。对于那些这样做的,调用foo.toList()[i]==foo.toList()[i]返回true。因此,平等性检查是有效的 这是怎么回事?我认为唯一可行的方法(缺少反射等)是,如

在Kotlin中,我有一个数据类的
MutableSet
。数据类不重写
equals()
hashCode()
。我在集合中遇到了涉及重复对象的bug,我注意到调用
foo.containsAll(foo)
会返回集合的
false

我检查了集合中的每个项目,只有少数返回
foo.contains(foo.toList()[I])
。对于那些这样做的,调用
foo.toList()[i]==foo.toList()[i]
返回
true
。因此,平等性检查是有效的


这是怎么回事?

我认为唯一可行的方法(缺少反射等)是,如果您的数据类包含可变的内容,并且在添加到集合后实例的状态发生了变化,等等

data class Foo(var int: Int = 0)
data class Bar(val string: String, val foo: Foo = Foo())

val bars = mutableSetOf<Bar>()
bars += Bar("")
bars += Bar("")

println(bars.containsAll(bars)) // true

bars.first().foo.int = 12

println(bars.containsAll(bars)) // false
数据类Foo(var int:int=0)
数据类栏(val string:string,val foo:foo=foo())
val bars=mutableSetOf()
条+=条(“”)
条+=条(“”)
println(bar.containsAll(bar))//真
bar.first().foo.int=12
println(bar.containsAll(bar))//false
这是因为集合中使用了
hashCode()
的结果来标识它,但如果数据类实例中的状态发生了更改,则它可能具有不同的哈希值,从而导致类似的问题


通常情况下,集合中的元素和映射中的键应该是不可变的,以避免这个问题。

我认为唯一可行的方法(缺少反射等)是,如果您的数据类包含可变的内容,并且在添加到集合后实例的状态发生了变化,等等

data class Foo(var int: Int = 0)
data class Bar(val string: String, val foo: Foo = Foo())

val bars = mutableSetOf<Bar>()
bars += Bar("")
bars += Bar("")

println(bars.containsAll(bars)) // true

bars.first().foo.int = 12

println(bars.containsAll(bars)) // false
数据类Foo(var int:int=0)
数据类栏(val string:string,val foo:foo=foo())
val bars=mutableSetOf()
条+=条(“”)
条+=条(“”)
println(bar.containsAll(bar))//真
bar.first().foo.int=12
println(bar.containsAll(bar))//false
这是因为集合中使用了
hashCode()
的结果来标识它,但如果数据类实例中的状态发生了更改,则它可能具有不同的哈希值,从而导致类似的问题


通常情况下,集合中的元素和映射中的键应该是不可变的,以避免此问题。

正在努力重新编程:。你能造一个吗?我正在绞尽脑汁想一个。然而,我找到了一个解决办法。使用
foo.all{a->foo.any{b->a==b}
正在替代
containsAll()
。正在努力重新编程:。你能造一个吗?我正在绞尽脑汁想一个。然而,我找到了一个解决办法。使用
foo.all{a->foo.any{b->a==b}
可以替代
containsAll()
。谢谢!这就是我遇到的问题。但是,让
foo.containsAll(foo)
返回false仍然很奇怪。是的,这就是散列的工作原理,也是为什么不应该在散列中使用可变对象的原因(请注意,映射中的可变值很好,只是不是键)。谢谢!这就是我遇到的问题。但是,让
foo.containsAll(foo)
返回false仍然很奇怪。是的,这就是散列的工作原理,也是为什么不应该在散列中使用可变对象的原因(请注意,映射中的可变值很好,只是不是键)。