Kotlin中查找Sugar类列表字段最大最小值的最高效方案是什么?
效率对比结论
- 手动遍历的方案执行效率更高
第一种调用内置API的方案累计要执行4次全列表遍历:minBy、maxBy每调用一次都会完整遍历一次列表,时间复杂度为O(4n);第二种手动遍历方案仅需1次全列表遍历就能算出所有极值,时间复杂度为O(n),常量开销仅为前者的1/4,列表元素量级越大,性能优势越明显。 - 注意:你提供的手动遍历代码存在两个问题:
- Kotlin列表为0基索引,遍历范围写
1..list.size会访问到list[list.size]这个不存在的下标,触发索引越界异常,正确遍历范围应为1 until list.size - 如果列表为空,调用
list.first()会直接抛出NoSuchElementException,需要提前做空列表判断
- Kotlin列表为0基索引,遍历范围写
更优的高效实现方案
推荐使用Kotlin内置的fold函数实现单次遍历计算所有极值,既保留了手动遍历的高性能,又规避了手写循环的越界风险,代码更简洁易读,还天然兼容空列表场景:
// 先定义极值结果承载类 data class SugarExtrema( val minPrice: Double?, val maxPrice: Double?, val minWeight: Double?, val maxWeight: Double? ) // 单次遍历计算所有极值 val extrema = list.fold(SugarExtrema(null, null, null, null)) { acc, sugar -> SugarExtrema( minPrice = minOf(acc.minPrice ?: Double.MAX_VALUE, sugar.price), maxPrice = maxOf(acc.maxPrice ?: Double.MIN_VALUE, sugar.price), minWeight = minOf(acc.minWeight ?: Double.MAX_VALUE, sugar.weight), maxWeight = maxOf(acc.maxWeight ?: Double.MIN_VALUE, sugar.weight) ) } // 直接从extrema中取对应值即可,空列表会返回全null结果不会崩溃
该方案性能和正确修复后的手动遍历方案完全一致,不需要额外的遍历开销。
内容的提问来源于stack exchange,提问作者testivanivan
相关产品推荐
相关产品推荐

