data class DataItem(
val id: Int,
val value1: Int,
val value2: Int
)
fun main() {
val largeCollection = listOf(
DataItem(1, 3, 1),
DataItem(2, 2, 2),
DataItem(3, 3, 0),
DataItem(4, 1, 3)
)
val result = largeCollection.sortedWith(compareByDescending<DataItem> { it.value1 }
.thenBy { it.value2 })
.groupBy { it.id % 2 == 1 }
result.forEach { (isOdd, group) ->
println(if (isOdd) "奇数id组:" else "偶数id组:")
group.forEach { println(it) }
}
}
性能优化阐述
- 使用
sortedWith
和compareByDescending
:sortedWith
结合compareByDescending
和thenBy
可以高效地进行排序。compareByDescending
和thenBy
函数是Kotlin标准库提供的优化实现,底层对比较逻辑进行了较好的封装,相比于自己手动实现复杂的排序逻辑,减少了出错的可能性并且性能更优。
- 链式调用:使用链式调用,在排序后直接调用
groupBy
,避免了中间创建不必要的临时集合,减少了内存开销。
- 避免多次遍历:整个操作通过一次排序和一次分组完成,没有对集合进行多次不必要的遍历,降低了时间复杂度。
避免潜在性能问题
- 排序策略:在自定义排序中,
compareByDescending
和thenBy
函数使用了稳定排序算法,保证相同值元素的相对顺序不变,这样在value1
相同的情况下,value2
的升序排序逻辑不会被打乱,并且稳定排序在很多场景下性能表现更好。
- 分组策略:
groupBy
函数在实现时对元素进行一次遍历并根据给定的分组条件进行分组,性能较高。在分组条件{ it.id % 2 == 1 }
中,简单的取模运算时间复杂度为O(1),不会引入额外的性能开销。