Set中的重复项目

时间:2017-04-17 20:09:31

标签: collections kotlin

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

我浏览了集合中的每个项目,并且false只返回了少量foo.contains(foo.toList()[i])。对于那些做的人,调用foo.toList()[i] == foo.toList()[i]会返回true。所以,平等检查有效。

这里发生了什么?

1 个答案:

答案 0 :(得分:2)

我相信这是可行的唯一方法(缺少反射等),如果你的数据类包含一些可变的东西,并且在添加到集合之后实例改变状态等,例如

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

这是因为hashCode()的结果在集合中被用来标识它,但是如果状态在数据类的实例中发生变化,那么它可能会有不同的散列值导致这样的问题。 / p>

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