list - 如何使用 Kotlin 就地过滤列表?

标签 list kotlin filtering

在 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) }

关于list - 如何使用 Kotlin 就地过滤列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44674532/

相关文章:

java - 如何理解这个 Java 8 Stream collect() 方法?

python - 根据没有名称值的列过滤数据框

c# - DataGrid过滤,多输入,MVVM,C#

r - 过滤至少包含 X 个观测值且值大于(或等于)Y 的表行

python - 清理文件夹列表,只保留每组文件夹中的顶级文件夹

jquery - 使用slideToggle展开和折叠列表项

python - 根据组号制作新列表并添加分数

mysql - Spring Data 在 OneToMany 上创建内部联接

android - 如何使用 mockk 库模拟 android 上下文

kotlin - 如何在泛型接口(interface)中引用实现类