在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
)
我有两个列表 listOne
、listTwo
。 listOne
是主列表我想在 listTwo
中找到 present 的值并添加到新的 secondList
中。对此有更好的方法吗?
不,此代码不是性能最佳的。但修复实际上非常简单 - 只需更改您使用的数据结构的类型。
问题是列表没有针对搜索进行优化。对于 listOne
中的每个项目,我们必须迭代 listTwo
中的元素。因此,时间复杂度为 O(N*M)
,其中 N
和 M
相应地是 listOne
和 listTwo
的大小。我们可以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()
。
嘿,我在科特林工作。我为我的工作制定解决方案。但是我对我的方法是否有效感到有点困惑。我在想我的方法是为了速度、内存和适当的优化解决方案吗?有人可以指导我吗
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
)
我有两个列表 listOne
、listTwo
。 listOne
是主列表我想在 listTwo
中找到 present 的值并添加到新的 secondList
中。对此有更好的方法吗?
不,此代码不是性能最佳的。但修复实际上非常简单 - 只需更改您使用的数据结构的类型。
问题是列表没有针对搜索进行优化。对于 listOne
中的每个项目,我们必须迭代 listTwo
中的元素。因此,时间复杂度为 O(N*M)
,其中 N
和 M
相应地是 listOne
和 listTwo
的大小。我们可以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()
。