对优先队列中的这一行感到困惑

时间:2019-07-25 14:10:02

标签: java algorithm sorting data-structures priority-queue

我正在寻找一种解决方案,以按频率对字符进行排序。我有一些解决方案,但无法做到一行就可以了。

程序的完整代码为:

class Solution {
    public String frequencySort(String s) {
        HashMap<Character, Integer> map = new HashMap<>();
        for(char c: s.toCharArray()){
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        PriorityQueue<Character> maxHeap = new PriorityQueue<>((a,b) -> map.get(b)-map.get(a));
        maxHeap.addAll(map.keySet());
        StringBuilder result = new StringBuilder();
        while(!maxHeap.isEmpty()){
            char current = maxHeap.remove();
            for(int i =0; i<map.get(current); i++){
                result.append(current);
            }
        }
        return result.toString();
    }
}

我对此代码有疑问:

PriorityQueue<Character> maxHeap = new PriorityQueue<>((a,b) -> map.get(b)-map.get(a));

我完全不明白这行是什么意思。因此,您创建了一个优先级队列,然后为什么我们要从map.get(b)中减去map.get(a)。什么是a和b?

2 个答案:

答案 0 :(得分:1)

这是Java 8构造-lambda表达式。

https://www.tutorialspoint.com/java8/java8_lambda_expressions

PriorityQueue构造函数之一采用Comparator作为参数:

https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html#PriorityQueue-java.util.Comparator-

Comparator是一个功能接口,这意味着它声明了一个抽象方法。可以通过定义lambda表达式来实现功能接口。这就是代码中发生的事情。

您可以将lambda表达式视为

的直接实现
int compare(T o1, T o2)

Comparator界面的方法。

答案 1 :(得分:1)

它将队列的“优先级”定义为更大的数字(a或b)。变量名也给您一个提示-它正在创建一个最大堆。将所有数据输入到PriorityQueue中之后,执行get(0)将返回队列中的最大数字。

正如其他答案所述-(a,b) -> map.get(b)-map.get(a)是lambda函数。每当将新元素插入优先级队列时,都会调用该方法以确定该新元素应在队列中的位置。