【发布时间】:2021-01-20 22:31:14
【问题描述】:
以下问题需要在 jdk 1.8 之前解决。
我有一个字符串 S="aab"。所有字符都根据它们的频率放入HashMap。现在用Comparator 声明PriorityQueue。这样所有字符都可以按频率降序存储在PriorityQueue中。但我收到以下错误--
Map<Character, Integer> dicT = new HashMap<>();
for(int i = 0;i < S.length(); i++) {
dicT.put(S.charAt(i), dicT.getOrDefault(S.charAt(i), 0) + 1);
}
PriorityQueue<Character> maxHeap = new PriorityQueue(
new Comparator<Map.Entry<Character,Integer>>() {
public int compare(Map.Entry<Character, Integer> entry1,
Map.Entry<Character, Integer> entry2) {
return entry2.getValue().compareTo(entry1.getValue());
}
});
maxHeap.addAll(dicT.keySet());
错误(仅使用较新的jdk演示问题,目标jdk版本在jdk 1.8之前)---
java.lang.ClassCastException: 类 java.lang.Character
不能转换为类 java.util.Map$Entry
(java.lang.Character 和 java.util.Map$Entry 在模块中
java.base of loader 'bootstrap') 在第 14 行,
解决方案 1 美元。比较第 659 行,
java.base/java.util.PriorityQueue.siftUpUsingComparator 在第 636 行,
java.base/java.util.PriorityQueue.siftUp 在第 329 行,
java.base/java.util.PriorityQueue.offer 在第 310 行,
java.base/java.util.PriorityQueue.add 在第 187 行,
java.base/java.util.AbstractQueue.addAll 在第 22 行,
Solution.reorganizeString 在第 54 行,
DriverSolution.helper 在第 84 行,
Driver.main
但如果我使用 lambda,那么它工作正常 --
PriorityQueue<Character> maxHeap = new PriorityQueue(
(x, y) -> dicT.get(y) - dicT.get(x));
maxHeap.addAll(dicT.keySet());
请帮助我如何在没有 lambda 的情况下编写代码块?
【问题讨论】:
-
在创建泛型类的实例时不要忽略
<>,即new PriorityQueue<>(…),也不要因为忽略它而忽略编译器警告。对了,dicT.put(S.charAt(i),dicT.getOrDefault(S.charAt(i),0)+1);可以简化为dicT.merge(S.charAt(i), 1, Integer::sum);
标签: java arrays algorithm collections comparator