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 项目。