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

kotlin distinct() or distinctBy {} from 2 existing arrays

试图了解 distinct() 和 distinctBy 函数来检查重复项。 当我尝试使用 "distinct" 字符串列表时,它工作正常。 当我尝试使用类型 "Any" 和自定义 class 时,运气不好 :( 谁能帮我理解一下?

    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.

我能想到的唯一问题是您的 Person class 不是数据 class 或者它没有正确的主构造函数。

data class Person(
    val name: String,
    var age: Int
)

如果你的人 class 是那样的人,那么:

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)
}

将导致:

[Person(name=Terry, age=13), Person(name=Joe, age=20), Person(name=Sam, age=33), Person(name=Valdi, age=55), Person(name=Tak, age=54)]

如您所料

顺便说一句,data class 意味着 class 自动生成 equals(), hashCode(), toString(), copy() 方法。 另外 - 请注意,编译器仅使用在主构造函数内定义的属性来自动生成函数。要从生成的实现中排除 属性,请在 class 主体内声明它。

String 正确定义了 equals()hashCode() ,因此具有相同内容的对象被认为是相等的。您的 Person class 应该这样做(直接或通过使用 data class)以使 distinct()distinctBy() 正常工作。

Any 中这些方法的默认实现,就像 Java 的 Object 一样,将每个实例都视为不同的实例。