如何使用另一个列表的 id 来过滤列表?

J_S*_*ton 3 kotlin

我有一份清单ids。我想过滤我的列表,只保留该列表中与 id 匹配的值。

fun filterHelper(ids: List<Int>, list: List<People>) {
     list.filter { ids.contains(it.id) }
}
Run Code Online (Sandbox Code Playgroud)

但这是非常低效的。它本质上是遍历列表 O(n^2)。Kotlin 能让我做得更好吗?

Ada*_*hip 5

我最近问了一个关于切片地图的类似问题。答案是没有好的内置函数,但您可以通过使用 aSet代替 aList作为您的 id 来解决这个问题,这样您的比较查找时间为 O(1),因此总共为 O(n)。

data class People(val id: Int)

fun main() {
    val people = listOf(People(1), People(2), People(3), People(4))
    val ids = setOf(2, 4)

    val filtered = people.filter { it.id in ids }
    println(filtered)
}
Run Code Online (Sandbox Code Playgroud)

输出:

[People(id=2), People(id=4)]
Run Code Online (Sandbox Code Playgroud)

值得一提的是,如果您已经有一个列表,则可以使用以下命令轻松转换为集合:

list.toSet()
Run Code Online (Sandbox Code Playgroud)