来自2个现有数组的kotlindistant()或distinctBy {}

时间:2019-12-26 06:51:55

标签: kotlin duplicates distinct

试图了解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.

2 个答案:

答案 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()方法。 也-请注意,编译器仅对自动生成的函数使用在主构造函数中定义的属性。要从生成的实现中排除属性,请在类主体中声明它。