我有一个具有相同ID的对象列表,然后,我想保留一个具有最新日期的对象,并使用kotlin集合运算符删除另一个。例如我有:
{"id":111,
"date":"02/12/2017"
}
和另一个
{"id":111,
"date":"02/8/2018"}
在这种情况下,我想删除第一个对象。
答案 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>
) 。取而代之的是利用拥有不可变列表的好处:-)