在kotlin中使用find in foreach

Use of find in foreach in 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 中找到 present 的值并添加到新的 secondList 中。对此有更好的方法吗?

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

问题是列表没有针对搜索进行优化。对于 listOne 中的每个项目,我们必须迭代 listTwo 中的元素。因此,时间复杂度为 O(N*M),其中 NM 相应地是 listOnelistTwo 的大小。我们可以replace/convertlistTwo搭配一套。集合很适合搜索,它们在常数时间内搜索,所以最终的时间复杂度仅为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()