来自 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
一样,将每个实例都视为不同的实例。
试图了解 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
一样,将每个实例都视为不同的实例。