没有 Lambda 的 PriorityQueue 按映射值排序(Java 的旧版本)
PriorityQueue Sort By Map Value with out Lambda (older version of Java)
以下问题需要在 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: class java.lang.Character
cannot be cast to class java.util.Map$Entry
(java.lang.Character and java.util.Map$Entry are in module
java.base of loader 'bootstrap') at line 14,
Solution.compare at line 659,
java.base/java.util.PriorityQueue.siftUpUsingComparator at line 636,
java.base/java.util.PriorityQueue.siftUp at line 329,
java.base/java.util.PriorityQueue.offer at line 310,
java.base/java.util.PriorityQueue.add at line 187,
java.base/java.util.AbstractQueue.addAll at line 22,
Solution.reorganizeString at line 54,
DriverSolution.helper at line 84,
Driver.main
但是如果我使用 lambda 那么它工作正常 --
PriorityQueue<Character> maxHeap = new PriorityQueue(
(x, y) -> dicT.get(y) - dicT.get(x));
maxHeap.addAll(dicT.keySet());
请帮助我如何编写没有 lambda 的代码块?
您正在声明一个 PriorityQueue<Character>
,它使用 Comparator<Character>
来定义优先级。但是你提供了一个 Comparator<Map.Entry<...>>
因此错误。给它一个 Comparator<Character>
代替:
Comparator<Character> order = Comparator.comparingInt(dict::get).reversed();
PriorityQueue<Character> maxHeap = new PriorityQueue<>(order);
您可以使用匿名 class 而不是 Comparator
静态方法,但我真的看不出有任何理由这样做。
非常感谢您的帮助。这与我的 IDE 无关。我的工作场所不允许我们使用所有 Oracle 库。而且项目太旧了。使用旧版本 jdk。所以我们不能使用任何 lambda 或方法引用。但我能想出解决办法。
没有 Lambda --
PriorityQueue<Character> maxHeap= new PriorityQueue(new Comparator<Character>(){
public int compare(Character c1, Character c2){
return dicT.get(c2) - dicT.get(c1);
}
});
使用 Lambda --
PriorityQueue<Character> maxHeap =new PriorityQueue((x,y)->dicT.get(y)-dicT.get(x));
有方法参考--
PriorityQueue<Character> maxHeap = new PriorityQueue(Comparator.comparingInt(dicT::get).reversed());
以下问题需要在 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: class java.lang.Character
cannot be cast to class java.util.Map$Entry
(java.lang.Character and java.util.Map$Entry are in module
java.base of loader 'bootstrap') at line 14,
Solution.compare at line 659,
java.base/java.util.PriorityQueue.siftUpUsingComparator at line 636,
java.base/java.util.PriorityQueue.siftUp at line 329,
java.base/java.util.PriorityQueue.offer at line 310,
java.base/java.util.PriorityQueue.add at line 187,
java.base/java.util.AbstractQueue.addAll at line 22,
Solution.reorganizeString at line 54,
DriverSolution.helper at line 84,
Driver.main
但是如果我使用 lambda 那么它工作正常 --
PriorityQueue<Character> maxHeap = new PriorityQueue(
(x, y) -> dicT.get(y) - dicT.get(x));
maxHeap.addAll(dicT.keySet());
请帮助我如何编写没有 lambda 的代码块?
您正在声明一个 PriorityQueue<Character>
,它使用 Comparator<Character>
来定义优先级。但是你提供了一个 Comparator<Map.Entry<...>>
因此错误。给它一个 Comparator<Character>
代替:
Comparator<Character> order = Comparator.comparingInt(dict::get).reversed();
PriorityQueue<Character> maxHeap = new PriorityQueue<>(order);
您可以使用匿名 class 而不是 Comparator
静态方法,但我真的看不出有任何理由这样做。
非常感谢您的帮助。这与我的 IDE 无关。我的工作场所不允许我们使用所有 Oracle 库。而且项目太旧了。使用旧版本 jdk。所以我们不能使用任何 lambda 或方法引用。但我能想出解决办法。
没有 Lambda --
PriorityQueue<Character> maxHeap= new PriorityQueue(new Comparator<Character>(){ public int compare(Character c1, Character c2){ return dicT.get(c2) - dicT.get(c1); } });
使用 Lambda --
PriorityQueue<Character> maxHeap =new PriorityQueue((x,y)->dicT.get(y)-dicT.get(x));
有方法参考--
PriorityQueue<Character> maxHeap = new PriorityQueue(Comparator.comparingInt(dicT::get).reversed());