如何在Kotlin中用sortedBy对Int类型二维数组按子数组首元素排序?
Kotlin二维数组按子数组首元素排序的解决方法
问题原因
你用的intervals.sortedBy { it[0] }逻辑本身是正确的,但它是非原地排序——调用后会返回一个新的排序后的List<IntArray>,原数组intervals不会被修改。如果只是调用这个方法却没接收返回值,自然看不到排序后的结果。
两种解决方式
方式1:接收排序后的新列表(不修改原数组)
适合不需要改变原数组的场景,直接接收sortedBy的返回值即可:
val intervals: Array<IntArray> = arrayOf( intArrayOf(1, 3), intArrayOf(15, 18), intArrayOf(8, 10), intArrayOf(2, 6), ) // 接收排序后的新列表 val sortedIntervals = intervals.sortedBy { it[0] } // 按指定格式输出 sortedIntervals.forEachIndexed { index, ints -> print("(${ints[0]},${ints[1]})${if (index != sortedIntervals.lastIndex) "; " else ""}") }
运行后输出:(1,3); (2,6); (8,10); (15,18)
方式2:原地修改原数组
如果希望直接修改原数组,使用sortBy方法(注意少一个s),它是Array的扩展函数,会直接对原数组排序:
val intervals: Array<IntArray> = arrayOf( intArrayOf(1, 3), intArrayOf(15, 18), intArrayOf(8, 10), intArrayOf(2, 6), ) // 原地排序原数组 intervals.sortBy { it[0] } // 按指定格式输出 intervals.forEachIndexed { index, ints -> print("(${ints[0]},${ints[1]})${if (index != intervals.lastIndex) "; " else ""}") }
运行后同样得到期望的输出。
两者区别
sortedBy:返回新的排序后的List,原数组保持不变,属于不可变操作。sortBy:直接修改原Array,不返回新对象,属于可变操作。
内容的提问来源于stack exchange,提问作者gmmo
相关产品推荐
相关产品推荐

