没有 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 或方法引用。但我能想出解决办法。

  1. 没有 Lambda --

    PriorityQueue<Character> maxHeap= new PriorityQueue(new Comparator<Character>(){           
         public int compare(Character c1, Character c2){
             return dicT.get(c2) - dicT.get(c1);
         }            
     });
    
  2. 使用 Lambda --

    PriorityQueue<Character> maxHeap =new PriorityQueue((x,y)->dicT.get(y)-dicT.get(x));
    
  3. 有方法参考--

    PriorityQueue<Character> maxHeap = new PriorityQueue(Comparator.comparingInt(dicT::get).reversed());