如何在定製對象列表上使用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