1. 概述

在本教程中,我们将学习如何根据值对 LinkedHashMap 进行排序。我们会介绍几种不同的实现方式,适用于不同场景下的排序需求。

2. 通过转换为 List 实现排序

最简单的方式是将 LinkedHashMap 转换为键值对的列表,然后根据值排序,再重新构造一个新的 LinkedHashMap

具体步骤如下:

✅ 将 Map 转换为 List<Pair<K, V>>
✅ 对列表进行排序
✅ 使用排序后的列表构建新的 LinkedHashMap

示例代码如下:

@Test
fun `when given hashLinkedMap then it is sorted by values using list and sortedWith method`() {
    val ageOfStudents = linkedMapOf(
        "Mark" to 22,
        "Peter" to 23,
        "John" to 20
    )

    val sortedPairList = ageOfStudents.toList().sortedWith(compareBy { it.second })
    val result = linkedMapOf(*sortedPairList.toTypedArray())
    val expectedStudentsSortedByValues = linkedMapOf(
        "John" to 20,
        "Mark" to 22,
        "Peter" to 23
    )
    assertThat(result).isEqualTo(expectedStudentsSortedByValues)
}

⚠️ 注意:我们使用了 Kotlin 的 spread operator*)将数组展开为 vararg 参数,以适配 linkedMapOf() 的参数类型要求。

3. 使用 sortedBy() 方法排序

相比 sortedWith(),**sortedBy() 更加简洁,适合直接根据某个属性排序**,比如根据键值对的值排序。

示例代码如下:

@Test
fun `when given hashLinkedMap then it is sorted by values using sortedBy method`() {
    val ageOfStudents = linkedMapOf(
        "Mark" to 22,
        "Peter" to 23,
        "John" to 20
    )

    val sortedPairList = ageOfStudents.toList().sortedBy { it.second }
    val result = linkedMapOf(*sortedPairList.toTypedArray())
    val expectedStudentsSortedByValues = linkedMapOf(
        "John" to 20,
        "Mark" to 22,
        "Peter" to 23
    )
    assertThat(result).isEqualTo(expectedStudentsSortedByValues)
}

这种方式更直观,适用于排序逻辑不复杂的情况。

4. 小结

虽然 LinkedHashMap 本身不支持直接根据值排序,但通过将其转换为列表再排序,最后重新构建 Map 的方式可以轻松实现需求。

✅ 优点:实现简单,逻辑清晰
❌ 缺点:需要创建中间列表和新 Map,性能略低(对小数据量影响不大)

如需查看完整代码,欢迎访问 GitHub 项目


原始标题:Sort LinkedHashMap by Values in Kotlin