如何使用集合运算符按日期在Kotlin中删除对象列表中的重复项?

时间:2018-09-11 07:27:44

标签: kotlin

我有一个具有相同ID的对象列表,然后,我想保留一个具有最新日期的对象,并使用kotlin集合运算符删除另一个。例如我有:

{"id":111,
 "date":"02/12/2017"
 }

和另一个

{"id":111,
 "date":"02/8/2018"}

在这种情况下,我想删除第一个对象。

2 个答案:

答案 0 :(得分:0)

您可以这样实现

list.groupBy { it.id }.entries.map { it.value.maxBy { it.date } }

它将创建id, List<object>的地图,同时保持原始顺序,然后从列表中选择最新的对象。 在这里,我假设日期是long值时间戳

答案 1 :(得分:0)

如果您确实必须从当前集合中删除条目,则以下内容可能会对您有所帮助(我假设您的对象(Obj)包含在名为list的列表中):

list.removeAll { anObj -> list.any { anObj.id == it.id && it.date > anObj.date } }
// or same with removeIf

首先收集您真正感兴趣的内容,然后首先列出不可变的列表,可能会更容易。

可以按以下步骤收集您感兴趣的元素(当然,还有很多其他方法可以实现……只是其中的一种):

val result = list.groupBy { it.id }.values.mapNotNull { it.maxBy { it.date } } // mapNotNull is only used due to maxBy returning a nullable type... it isn't really needed... or well... depends on what your date type is ;-)

result将成为List<Obj>。如果您知道至少有1个元素,也可以使用mapNotNull代替it.maxBy { it.date }!!

如果您仍然需要从列表中删除元素,则可以执行以下操作:

list.removeIf { it !in result }
// or
list.removeAll { it !in result }

但是,我真的不建议您仅为此更改当前列表...上例中的result已包含所需形式的所有元素(即List<Obj>) 。取而代之的是利用拥有不可变列表的好处:-)