Java中如何将排序后的集合转回HashMap?HashMap排序后类型转换问题求助
解决HashMap排序后无法保持有序的问题
嘿,这个坑我之前踩过!先给你敲个警钟:HashMap本身是不保证任何顺序的——哪怕你把排序好的元素一个个塞进去,它也会根据哈希值重新排列,所以你想要的“已排序的HashMap”从本质上来说是不存在的。
为什么你的代码没法达到预期?
看你的代码,你创建了sortedHashMap但根本没把排序后的list元素放进去;就算你放进去了,HashMap也会立刻打乱顺序,等于白排序。而且list.sort()是void方法,不能直接赋值给HashMap,这也是你注释那行代码报错的原因。
正确的解决方案:用LinkedHashMap保留顺序
如果你需要一个能保持插入顺序的Map,应该用LinkedHashMap——它会记住元素的插入顺序,刚好符合你排序后保留顺序的需求。
修改后的代码如下:
private LinkedHashMap<int[], Double> sortHashMap(HashMap<int[], Double> hashMap) { // 用LinkedHashMap来保存排序后的顺序 LinkedHashMap<int[], Double> sortedMap = new LinkedHashMap<>(); // 把HashMap的entry转成List,按value排序 List<Map.Entry<int[], Double>> entryList = new ArrayList<>(hashMap.entrySet()); entryList.sort(Map.Entry.comparingByValue()); // 把排序后的entry逐个放入LinkedHashMap for (Map.Entry<int[], Double> entry : entryList) { sortedMap.put(entry.getKey(), entry.getValue()); } return sortedMap; }
额外注意:int[]作为HashMap的key有坑!
这里还要提醒你:int[]作为HashMap的key时,它的equals()和hashCode()是基于对象引用的,而不是数组内容。也就是说,两个内容完全相同的int[]会被当成不同的key,比如:
int[] arr1 = {1,2}; int[] arr2 = {1,2}; hashMap.put(arr1, 1.0); hashMap.get(arr2); // 会返回null,因为arr1和arr2是不同的对象
如果你的业务需要按数组内容作为key,建议:
- 改用
List<Integer>作为key(它的equals和hashCode是基于内容的) - 或者自定义一个包装类,重写
equals()和hashCode()方法,基于数组内容计算
内容的提问来源于stack exchange,提问作者Kazim
相关产品推荐
相关产品推荐

