如何对以LinkedList<Integer>为键的LinkedHashMap进行排序?
解决LinkedHashMap按LinkedList键排序的类型错误问题
首先得明确报错的根源:Map.Entry.comparingByKey()默认要求键的类型必须实现Comparable接口,但LinkedList<Integer>本身并没有实现这个接口,编译器不知道该怎么比较两个LinkedList键的大小,这就是你看到的「类型不兼容」错误。
从你期望的输出顺序来看,是要按LinkedList里的元素依次对比排序(先比第一个元素,0 < 10 < 210,对应键的顺序就符合预期),那咱们得手动给程序指定一个比较规则。
解决方案代码
修改流排序逻辑,自定义一个Comparator来处理LinkedList<Integer>类型的键比较:
LinkedHashMap<LinkedList<Integer>, float[]> sortedMap = new LinkedHashMap<>(); hm.entrySet() .stream() .sorted(Map.Entry.comparingByKey(new Comparator<LinkedList<Integer>>() { @Override public int compare(LinkedList<Integer> o1, LinkedList<Integer> o2) { // 按链表元素逐个对比,匹配你期望的排序逻辑 for (int i = 0; i < Math.min(o1.size(), o2.size()); i++) { int cmp = o1.get(i).compareTo(o2.get(i)); if (cmp != 0) { return cmp; } } // 如果前面元素都相同,再按链表长度排序 return Integer.compare(o1.size(), o2.size()); } })) .forEachOrdered(x -> sortedMap.put(x.getKey(), x.getValue())); hm = sortedMap;
嫌匿名内部类啰嗦的话,用Lambda表达式简化更清爽:
LinkedHashMap<LinkedList<Integer>, float[]> sortedMap = new LinkedHashMap<>(); hm.entrySet() .stream() .sorted(Map.Entry.comparingByKey((o1, o2) -> { for (int i = 0; i < Math.min(o1.size(), o2.size()); i++) { int cmp = o1.get(i).compareTo(o2.get(i)); if (cmp != 0) return cmp; } return Integer.compare(o1.size(), o2.size()); })) .forEachOrdered(x -> sortedMap.put(x.getKey(), x.getValue())); hm = sortedMap;
为什么这个方法能解决问题?
咱们自定义的比较器会逐个对比两个LinkedList的元素:先比第一个元素,不同就直接返回结果;如果第一个元素相同,就比第二个,以此类推。如果所有对应位置的元素都一致,再比较链表长度。这样既符合你想要的排序逻辑,又给编译器明确了键的比较规则,自然就解决了类型错误。
验证输出
运行这段代码后,输出会和你期望的完全一致:
{0, 41}, {10.3f, 50.05f, 9.9f}
{10, 7}, {0.14f, 1.2f, 85.01f}
{210, 3}, {17.0f, 4.0f, 2.1f}
内容的提问来源于stack exchange,提问作者qraqatit
相关产品推荐
相关产品推荐

