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

HashMap存储有序列表后顺序变更问题求助(附Kotlin代码)

问题分析与解决方案

你遇到的问题核心在于**HashMap本身是无序的**——它不会维护键的插入顺序,底层依赖哈希表实现,键的存储位置由哈希值决定,所以遍历keys时的顺序和你插入的顺序完全无关,这就是为什么原列表有序,但分组后HashMap的键顺序乱了。

解决方案:使用有序的Map实现

要保留父ID的插入顺序(也就是原列表中父ID首次出现的顺序),你需要用LinkedHashMap替代HashMap。LinkedHashMap在哈希表的基础上维护了一个双向链表,专门记录键的插入顺序,遍历的时候会按照插入顺序返回键。

优化后的代码

我帮你简化了代码逻辑(用Kotlin的getOrPut方法替代冗余的null判断),同时修正了变量名(package是Kotlin的关键字,不能用作变量名):

// 用LinkedHashMap替代HashMap,保证插入顺序
val packageMap = LinkedHashMap<String, MutableList<Model>>()
for (item in list!!) {
    // getOrPut:如果键存在就返回对应列表,不存在就创建新列表并放入Map
    val groupList = packageMap.getOrPut(item.parentId!!) { mutableListOf() }
    groupList.add(item)
    Log.e("package", Gson().toJson(packageMap.keys))
}

更简洁的Kotlin风格写法

如果你想进一步简化代码,可以直接用Kotlin标准库的groupByTo函数,一行完成分组,并且指定用LinkedHashMap来保留顺序:

val packageMap = list!!.groupByTo(LinkedHashMap()) { it.parentId!! }

这个方法会自动把列表元素按parentId分组,并且保留原列表中父ID首次出现的顺序,非常高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:06:38