在Java中,我可以使用以下代码从列表中删除项目:

private void filterList(List<Item> items) {
    Iterator<Item> iterator = items.iterator();
    while (iterator.hasNext()) {
        if (checkItem(iterator.next())) {
            iterator.remove();
        }
    }
}

如何在Kotlin中做到这一点(即在不重新创建的情况下删除List中的某些项目)?

最佳答案

只需使用都接受谓词的 .retainAll { ... } .removeAll { ... } 对其进行原位过滤:

items.retainAll { shouldRetain(it) }
items.removeAll { shouldRemove(it) }

请注意,items应该是一个MutableList<T>,而不仅仅是List<T>,它是Kotlin中的只读列表,因此不会暴露任何变异函数(请参阅:语言引用中的Collections)。

顺便说一句,对于支持随机访问的列表,有效地实现了这两个功能:然后,在删除每个项目之后(O(n2)时间最坏的情况),列表不会被压缩,而是将项目在列表中移动。被处理,给定O(n)时间。

而且,如果您不想修改原始列表,则可以使用 .filter { ... } .filterNot { ... } 生成仅包含要保留的项目的单独集合,这也适用于只读List<T>:
val filtered = items.filter { shouldRetain(it) }
val filtered = items.filterNot { shouldRemove(it) }

10-07 19:28
查看更多