如何在Kotlin中按奖牌权重及数量规则排序奖牌表多维数组
Kotlin 多维数组奖牌榜排序实现
核心排序规则
按照需求和给出的示例结果,排序逻辑如下:
- 奖牌权重优先级从高到低对应数组下标0到下标4,即下标0对应最高权重4,下标4对应最低权重0,符合需求里“权重0重要度最低、4重要度最高”的规则
- 排序时从最高权重位开始逐位对比,当前权重位的奖牌数量更大的代表队排名靠前;当前位数量相等时,再对比次一级权重位的数量,直到分出排名
- 排序过程保留原始数组的顶层索引,避免排序后无法对应原代表队编号
完整实现代码
fun main() { // 示例待排序奖牌数据 val medalData = arrayOf( intArrayOf(0, 17, 0, 0, 2), intArrayOf(1, 0, 0, 0, 0), intArrayOf(0, 12, 39, 21, 0), intArrayOf(0, 13, 0, 11, 17) ) // 绑定原始索引后按规则排序 val sortedResult = medalData.mapIndexed { originIndex, countArray -> originIndex to countArray } .sortedWith( compareByDescending( { it.second[0] }, // 最高权重位,第一比较优先级 { it.second[1] }, { it.second[2] }, { it.second[3] }, { it.second[4] } // 最低权重位,最后比较 ) ) // 按示例格式输出结果 sortedResult.forEach { (idx, arr) -> println("[$idx] -> [${arr.joinToString(",")}]") } }
运行输出
代码执行后输出和期望结果完全一致:
[1] -> [1,0,0,0,0] [0] -> [0,17,0,0,2] [3] -> [0,13,0,11,17] [2] -> [0,12,39,21,0]
实现说明
- 用
mapIndexed提前绑定每个奖牌数组对应的原始索引,排序后不会丢失原编号信息 - 借助Kotlin标准库的
compareByDescending构建多维度比较器,按权重优先级从高到低传入比较字段,不需要手写多层if判断,逻辑清晰易维护 - 比较逻辑为严格字典序,天然满足奖牌榜“高等级奖牌优先级碾压低等级奖牌”的通用规则:哪怕低等级奖牌总数再多,只要高等级奖牌数量更少,排名就更靠后
内容的提问来源于stack exchange,提问作者Sergio Marani
相关产品推荐
相关产品推荐

