Kotlin 过滤,减法或分组-什么是最有效的?(科特林)
例如,我们有一个列表,我们想用特定的谓词将其分为两部分 首先,我们可以使用Kotlin 过滤,减法或分组-什么是最有效的?(科特林),kotlin,Kotlin,例如,我们有一个列表,我们想用特定的谓词将其分为两部分 首先,我们可以使用filter和filterNot val trueList = list.filter(predicate) val falseList = list.filterNot(predicate) 其次,我们可以使用过滤器和减法: val trueList = list.filter(predicate) val falseList = list.subtract(trueList) 第三,我们可以使用groupBy: v
filter
和filterNot
val trueList = list.filter(predicate)
val falseList = list.filterNot(predicate)
其次,我们可以使用过滤器
和减法
:
val trueList = list.filter(predicate)
val falseList = list.subtract(trueList)
第三,我们可以使用groupBy
:
val groupBy = list.groupBy(predicate)
val trueList = groupBy[true]
val falseList = groupBy[false]
最有效、最快的方法是什么?我们可以用其他函数来实现吗
我认为第二个选项是
减法是最差的,对吗?因此,我试图了解哪个选项最快:过滤,减法,分组比或分区(谢谢提示)。我使用measureTimeMillis
了解每个选项的运行时间:
private fun checkTime(list: List<Int>, predicate: (Int) -> Boolean) {
var sum = 0L
repeat(times) { sum += checkPartition(list, predicate) }
println("partition: ${sum/times}")
sum = 0L
repeat(times) { sum += checkFilter(list, predicate) }
println("filter: ${sum/times}")
sum = 0L
repeat(times) { sum += checkSubtract(list, predicate) }
println("subtract: ${sum/times}")
sum = 0L
repeat(times) { sum += checkGroupBy(list, predicate) }
println("group by: ${sum/times}")
}
private fun checkGroupBy(list: List<Int>, predicate: (Int) -> Boolean): Long {
return measureTimeMillis {
val groupBy = list.groupBy(predicate)
val falseList = groupBy[false]
val trueList = groupBy[true]
}
}
private fun checkSubtract(list: List<Int>, predicate: (Int) -> Boolean): Long {
return measureTimeMillis {
val trueList = list.filter(predicate)
val falseList = list.subtract(trueList)
}
}
private fun checkFilter(list: List<Int>, predicate: (Int) -> Boolean): Long {
return measureTimeMillis {
val trueList = list.filter(predicate)
val falseList = list.filterNot(predicate)
}
}
private fun checkPartition(list: List<Int>, predicate: (Int) -> Boolean): Long {
return measureTimeMillis {
val pair = list.partition(predicate)
val trueList = pair.first
val falseList = pair.second
}
}
对于不同大小的列表:
var list = (1..1_000_000).toList()
checkTime(list, predicate)
分区:16
过滤器:21
减:81
组别:18
分区:30
过滤器:42
减:241
组别:36
分区:35
过滤器:59
减:233
组别:63
所以,将列表分成两部分是一个非常好的选择
如果我做错了什么,请告诉我。您错过了最明显的选择:。感谢分区
,我知道应该有一个简单的选项。分区案例仅供参考。您可以利用Kotlin的解构操作。因此它变成了val(trueList,false list)=list.partition(predicate)
。IntelliJ甚至将其作为一种意图提供,并将为您更改代码。
var list = (1..1_000_000).toList()
checkTime(list, predicate)
list = (1..2_000_000).toList()
checkTime(list, predicate)
list = (1..3_000_000).toList()
checkTime(list, predicate)