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
相关产品推荐
相关产品推荐

