2017-08-25 1579 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, ...) }