在 kotlin 中使用 findeach in foreach



嘿,我在 kotlin 工作。我为我的工作制定解决方案。但我有点困惑,我的方法是否有效。我在想我的方法是否是为了速度、内存和适当的优化解决方案?有人可以指导我吗

val listOne = listOf<Int>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
val listTwo = listOf(4, 7, 9, 10, 12, 15, 18)
fun main() {
val secondList = mutableListOf<Second>()
listOne.forEachIndexed { index, value ->
val present = listTwo.find {
value == it
}
secondList.add(
Second(
index,
present != null
)
)
}
secondList.forEach { println(it) }
}
data class Second(
val value: Int,
val present: Boolean = false
)

我有两个列表listOnelistTwolistOne是主列表,我想在listTwo中找到存在的值并添加到新的secondList中。有没有更好的方法?

不,此代码不是性能最佳的。但是修复实际上非常简单 - 只需更改您使用的数据结构的类型。

问题是列表没有针对搜索进行优化。对于listOne中的每个项目,我们必须迭代listTwo中的元素。因此,时间复杂度O(N*M)其中NM的大小为listOne并相应地listTwo。我们可以用集合替换/转换listTwo。集合适合搜索,它们在恒定时间内搜索,因此由此产生的时间复杂度仅为O(N+M)M用于准备集合和N用于迭代listOne和搜索。

此外,通过使用mapIndexed()并将find()替换为简单的in,可以大大简化您的代码:

val s = listTwo.toSet()
val secondList = listOne.mapIndexed { index, item ->
Second(index, item in s)
}

您也可以直接创建集,使用setOf()而不是listOf()

最新更新