You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中如何用自定义比较器创建复合键Sorted Map?

创建带复合键的SortedMap(Kotlin惯用方式)

要创建按复合键(如Pair<Int, String>)排序的SortedMap,且遵循“先比较键对第一个元素,再比较第二个元素”的规则,最符合Kotlin惯用风格的方式是利用标准库提供的compareBy+thenBy构建比较器,再结合toSortedMap或sortedMapOf实现:

方法1:从现有普通Map转换为不可变SortedMap

如果已经有现成的键值对集合,直接用toSortedMap扩展函数是最简洁的方式:

val myMap = mapOf(
    Pair(1, "a") to "A",
    Pair(2, "a") to "AA",
    Pair(1, "b") to "B"
).toSortedMap(compareBy<Pair<Int, String>> { it.first }.thenBy { it.second })

方法2:直接创建可变SortedMap并初始化

如果需要创建可修改的SortedMap,用sortedMapOf传入自定义比较器,再通过初始化块填充数据:

val myMap = sortedMapOf(compareBy { it.first }.thenBy { it.second }) {
    put(Pair(1, "a"), "A")
    put(Pair(2, "a"), "AA")
    put(Pair(1, "b"), "B")
}

补充:关于默认排序的说明

实际上,Pair<Int, String>本身已经实现了Comparable接口,其自然排序规则就是先比较第一个元素,再比较第二个元素,所以如果没有特殊自定义需求,直接使用sortedMapOf传入键值对也能得到符合预期的有序Map:

// 此代码实际可正常工作,SortedMap会自动按Pair的自然排序组织键
val myMap = sortedMapOf(
    Pair(1, "a") to "A",
    Pair(2, "a") to "AA",
    Pair(1, "b") to "B"
)

你之前遇到的“无法正常工作”可能是误解了SortedMap的特性:它会忽略初始化时的元素顺序,始终按照键的排序规则自动整理结构,最终的Map会呈现(1,"a") → "A"、(1,"b") → "B"、(2,"a") → "AA"的有序状态。


内容的提问来源于stack exchange,提问作者k314159

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:18:26