在优先队列中,对于这行代码感到困惑

3

我正在寻找一个按频率排序字符的问题的解决方案。我得到了一些解决方案,但无法理解其中一行代码。

程序的完整代码如下:

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
它将一个 lambda 作为比较器传递给构造函数。 - Federico klez Culloca
2个回答

3

这是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
它定义了队列的“优先级”,即较大的数字(a或b)。变量名也给了你一个提示——它创建了一个最大堆。在将所有数据输入PriorityQueue之后,执行get(0)将返回队列中最大的数字。
就像其他答案所提到的一样 - (a,b) -> map.get(b)-map.get(a)是一个lambda函数。每当新元素插入到优先队列中时,该方法将被调用以确定新元素应放置在队列中的位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接