如何根据HashMap的ArrayList<Integer>值长度对HashMap进行排序
错误原因
Collections.sort()方法要求第一个入参必须为List类型,而HashMap.values()的返回值是Collection接口实现类,不满足List的类型约束,因此会抛出类型不匹配异常。
另外如果直接对values排序,会丢失ArrayList对应的原key关联关系,通常建议对entrySet进行排序保留完整键值对映射。
解决方案
场景1:需要保留键值对对应关系(推荐)
排序后仍可获取每个ArrayList对应的原key:
Java 8及以上版本写法
HashMap<Integer, ArrayList<Integer>> NameofMap = new HashMap<Integer, ArrayList<Integer>>(); // 先将entrySet转为List List<Map.Entry<Integer, ArrayList<Integer>>> sortedEntry = new ArrayList<>(NameofMap.entrySet()); // 按ArrayList长度升序排序,需要降序可追加.reversed() sortedEntry.sort(Comparator.comparingInt(entry -> entry.getValue().size()));
Java 7及更低版本写法
HashMap<Integer, ArrayList<Integer>> NameofMap = new HashMap<Integer, ArrayList<Integer>>(); List<Map.Entry<Integer, ArrayList<Integer>>> sortedEntry = new ArrayList<Map.Entry<Integer, ArrayList<Integer>>>(NameofMap.entrySet()); Collections.sort(sortedEntry, new Comparator<Map.Entry<Integer, ArrayList<Integer>>>() { @Override public int compare(Map.Entry<Integer, ArrayList<Integer>> o1, Map.Entry<Integer, ArrayList<Integer>> o2) { // 升序排序,需要降序可交换o1和o2的位置 return Integer.compare(o1.getValue().size(), o2.getValue().size()); } });
场景2:仅需排序value,无需关联原key
如果你的需求只需要拿到排序后的ArrayList集合,不需要对应原key:
HashMap<Integer, ArrayList<Integer>> NameofMap = new HashMap<Integer, ArrayList<Integer>>(); // 先将values转为List再排序 List<ArrayList<Integer>> sortedValues = new ArrayList<>(NameofMap.values()); Collections.sort(sortedValues, new Comparator<ArrayList<Integer>>() { @Override public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) { return Integer.compare(o1.size(), o2.size()); } });
内容的提问来源于stack exchange,提问作者Tarasa Bell
相关产品推荐
相关产品推荐

