试图了解distinct()和distinctBy函数来检查重复项。 当我尝试用字符串列表“区别”时,它工作正常。 当我尝试使用“ Any”类型与自定义类不碰运气时:( 有人可以帮我理解吗?
var a = ArrayList<Any>()
val terry = Person("Terry",13)
val joe = Person("Joe", 20)
val sam1 = Person("Sam",33 )
a.add(terry)
a.add(joe)
a.add(sam1)
var b = ArrayList<Any>()
val valdi = Person("Valdi",55)
val tak = Person("Tak", 54)
val sam2 = Person("Sam",33 )
b.add(valdi)
b.add(tak)
b.add(sam2)
a.addAll(b)
val c = a.distinct()
println(c) //prints all 6 items. sam1 and sam2 is duplicated.
答案 0 :(得分:3)
String
正确定义了equals()
和hashCode()
,以便将内容相同的对象视为相等。您的Person
类应该这样做(直接或通过使用data class
)以使distinct()
和distinctBy()
正常工作。
Any
中这些方法的默认实现与Java的Object
一样,将每个实例视为彼此不同。
答案 1 :(得分:2)
我唯一想到的问题是您的Person
类不是数据类,或者没有适当的Primary构造函数。
data class Person(
val name: String,
var age: Int
)
如果您的Person类是这样的,则:
fun findDistinct() {
val a = ArrayList<Any>()
val terry = Person("Terry", 13)
val joe = Person("Joe", 20)
val sam1 = Person("Sam", 33)
a.add(terry)
a.add(joe)
a.add(sam1)
val b = ArrayList<Any>()
val valdi = Person("Valdi", 55)
val tak = Person("Tak", 54)
val sam2 = Person("Sam", 33)
b.add(valdi)
b.add(tak)
b.add(sam2)
a.addAll(b)
val c = a.distinct()
println(c)
}
将导致:
[人(名字=特里,年龄= 13),人(名字=乔,年龄= 20), 人员(姓名=山姆,年龄= 33),人员(姓名= Valdi,年龄= 55),人员(姓名=德, 年龄= 54)]
与您期望的一样
BTW具有data class
意味着该类自动生成equals(), hashCode(), toString(), copy()
方法。 也-请注意,编译器仅对自动生成的函数使用在主构造函数中定义的属性。要从生成的实现中排除属性,请在类主体中声明它。