kotlin distinct()或通过{}与2个现有数组进行区分
试图通过检查重复项的功能来理解不同的内容。 当我尝试使用字符串列表进行distinct时,效果很好。 当我尝试使用自定义类的Any类型时,运气不佳: 有人能帮我理解吗kotlin distinct()或通过{}与2个现有数组进行区分,kotlin,duplicates,distinct,Kotlin,Duplicates,Distinct,试图通过检查重复项的功能来理解不同的内容。 当我尝试使用字符串列表进行distinct时,效果很好。 当我尝试使用自定义类的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)
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类不是数据类,或者它没有正确的主构造函数
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,
Personname=Sam,年龄=33,Personname=Valdi,年龄=55,Personname=Tak,
年龄=54]
如你所料
顺便说一句,拥有数据类意味着该类自动生成equals、hashCode、toString和copy方法。另外-请注意,编译器仅使用主构造函数中为自动生成的函数定义的属性。要从生成的实现中排除属性,请在类主体中声明它。我能想到的唯一问题是Person类不是数据类,或者它没有正确的主构造函数
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,
Personname=Sam,年龄=33,Personname=Valdi,年龄=55,Personname=Tak,
年龄=54]
如你所料
顺便说一句,拥有数据类意味着该类自动生成equals、hashCode、toString和copy方法。另外-请注意,编译器仅使用主构造函数中为自动生成的函数定义的属性。要从生成的实现中排除属性,请在类主体中声明它。字符串正确定义了equals和hashCode,以便具有相同内容的对象被视为相等。您的Person类应该直接这样做,或者通过使用数据类使distinct和distinctBy正常工作
这些方法在Any中的默认实现,就像Java的对象一样,将每个实例视为不同于其他实例。字符串正确定义了equals和hashCode,因此具有相同内容的对象被视为相等。您的Person类应该直接这样做,或者通过使用数据类使distinct和distinctBy正常工作
这些方法在任何情况下的默认实现,就像Java的对象一样,将每个实例视为不同于任何其他实例。我尝试了您的代码,它没有复制sam1和sam2,其中Person为数据类我尝试了您的代码,并且没有复制sam1和sam2,Person为数据类简短但甜蜜:-OP应该注意,任何定义了将每个对象视为不同于其他对象,所以这就是你得到的,你不会覆盖它们。简短但甜蜜:-OP应该注意,任何定义equals和hashCode方法都会将每个对象视为不同的对象,所以这就是你得到的,你不会覆盖它们。嗨,从val sam2中删除Sam怎么样?因为val sam1具有Sam的现有值?您好,从val sam2中删除Sam如何?因为val sam1具有Sam的现有值?