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

