2017-08-25 1577 views
4

如何在定製對象列表上使用distinctBy去除重複項?我想通過對象的多個屬性來確定「唯一性」,但不是全部。如何從Kotlin中的列表中刪除具有distinctBy的重複對象?

我希望這樣的事情會的工作,但沒有運氣:

val uniqueObjects = myObjectList.distinctBy { it.myField, it.myOtherField }

編輯:我很好奇如何在我的例子使用上面distinctBy與任意數量的屬性,而不是兩個像。

回答

9

您可以創建一對:

myObjectList.distinctBy { Pair(it.myField, it.myOtherField) } 

distinctBy將使用Pair平等,以確定唯一性。

+2

甚至只是'it.myField到it.myOtherField'。 – marstran

+0

謝謝,但如果我需要比較四個,五個或更多屬性,那麼該怎麼辦? – njenson

+3

爲了比較更多的值,你可以使用'.distinctBy {listOf(...)}' – hotkey

3

如果您看看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, ...) }