首页 > 解决方案 > 对优先队列中的这条线感到困惑

问题描述

我正在寻找按频率对字符进行排序的问题的解决方案。我得到了一些解决方案,但无法完成一行。

该程序的完整代码是:

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?

标签: javaalgorithmsortingdata-structurespriority-queue

解决方案


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

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

其中一个PriorityQueue构造函数将 aComparator作为参数:

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


推荐阅读