【发布时间】:2021-02-10 03:26:13
【问题描述】:
我有一个ids 的列表。我想过滤我的列表,只保留该列表中与 id 匹配的值。
fun filterHelper(ids: List<Int>, list: List<People>) {
list.filter { ids.contains(it.id) }
}
但这是非常低效的。它本质上是遍历列表 O(n^2)。 Kotlin 会让我做得更好吗?
【问题讨论】:
标签: kotlin
我有一个ids 的列表。我想过滤我的列表,只保留该列表中与 id 匹配的值。
fun filterHelper(ids: List<Int>, list: List<People>) {
list.filter { ids.contains(it.id) }
}
但这是非常低效的。它本质上是遍历列表 O(n^2)。 Kotlin 会让我做得更好吗?
【问题讨论】:
标签: kotlin
我最近向similar question 询问了关于切片地图的问题。答案是没有好的内置函数,但是您可以通过使用Set 而不是List 来解决您的 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)
}
输出:
[People(id=2), People(id=4)]
值得一提的是,如果你已经有一个列表,你可以很容易地转换成一个集合:
list.toSet()
【讨论】: