如何在定制对象列表上使用distinctBy
去除重复项?我想通过对象的多个属性来确定“唯一性”,但不是全部。如何从Kotlin中的列表中删除具有distinctBy的重复对象?
我希望这样的事情会的工作,但没有运气:
val uniqueObjects = myObjectList.distinctBy { it.myField, it.myOtherField }
编辑:我很好奇如何在我的例子使用上面distinctBy
与任意数量的属性,而不是两个像。
如何在定制对象列表上使用distinctBy
去除重复项?我想通过对象的多个属性来确定“唯一性”,但不是全部。如何从Kotlin中的列表中删除具有distinctBy的重复对象?
我希望这样的事情会的工作,但没有运气:
val uniqueObjects = myObjectList.distinctBy { it.myField, it.myOtherField }
编辑:我很好奇如何在我的例子使用上面distinctBy
与任意数量的属性,而不是两个像。
您可以创建一对:
myObjectList.distinctBy { Pair(it.myField, it.myOtherField) }
的distinctBy
将使用Pair
平等,以确定唯一性。
如果您看看distinctBy
的实现,它只是将您在lambda中传递的值添加到Set
。如果Set
尚未包含指定的元素,则会将原始List
的相应项目添加到新的List
,并且新的List
由于distinctBy
而返回。
public inline fun <T, K> Iterable<T>.distinctBy(selector: (T) -> K): List<T> {
val set = HashSet<K>()
val list = ArrayList<T>()
for (e in this) {
val key = selector(e)
if (set.add(key))
list.add(e)
}
return list
}
所以,你可以通过保存,你需要找到独特的特性的复合物。
data class Selector(val property1: String, val property2: String, ...)
,并传递Selector
对象拉姆达内:
myObjectList.distinctBy { Selector(it.property1, it.property2, ...) }
甚至只是'it.myField到it.myOtherField'。 – marstran
谢谢,但如果我需要比较四个,五个或更多属性,那么该怎么办? – njenson
为了比较更多的值,你可以使用'.distinctBy {listOf(...)}' – hotkey