Kotlin中如何按对象timestamp属性降序排序对象Map?
Kotlin按自定义对象属性排序Map
toSortedMap()是针对Map的键排序的API,没法直接用它按值的属性排序。要实现按Image的timestamp排序,得先把Map转成条目列表,排序后再转成有序Map(比如LinkedHashMap)来保留顺序。
按timestamp降序排序(对应a→b→c的顺序)
如果要按timestamp从大到小排序,代码如下:
data class Image(val timestamp: Long) fun main() { val map = mutableMapOf<String, Image>() map["a"] = Image(999) map["b"] = Image(555) map["c"] = Image(333) // 按timestamp降序排序,转成LinkedHashMap保证顺序 val sortedDescMap = map.entries .sortedByDescending { it.value.timestamp } .associateBy({ it.key }, { it.value }) as LinkedHashMap<String, Image> // 输出结果:a、b、c sortedDescMap.keys.forEach(::println) }
按timestamp升序排序(对应c→b→a的顺序)
你提到期望排序后顺序是c、b、a,这其实是按timestamp从小到大(升序)排序,只需要把sortedByDescending换成sortedBy:
val sortedAscMap = map.entries .sortedBy { it.value.timestamp } .associateBy({ it.key }, { it.value }) as LinkedHashMap<String, Image> // 输出结果:c、b、a sortedAscMap.keys.forEach(::println)
额外提示
- 如果只是需要遍历排序后的条目,不需要转成Map的话,直接操作排序后的列表更高效:
map.entries.sortedBy { it.value.timestamp }.forEach { println("${it.key}: ${it.value.timestamp}") } associateBy默认返回普通HashMap,不保证顺序,所以必须强转成LinkedHashMap才能保留排序后的条目顺序。
内容的提问来源于stack exchange,提问作者Johann
相关产品推荐
相关产品推荐

