【问题标题】:Confused about this line in priority queue对优先队列中的这条线感到困惑
【发布时间】:2019-07-25 14:10:02
【问题描述】:

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

程序的完整代码为:

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是什么?

【问题讨论】:

  • 它向构造函数传递了一个 lambda 以充当比较器。

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


【解决方案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接口的方法。

【讨论】:

    【解决方案2】:

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

    正如其他答案所提到的 - (a,b) -&gt; map.get(b)-map.get(a) 是一个 lambda 函数。每当一个新元素被插入到优先队列中时,都会调用该方法以确定新元素应该在队列中的哪个位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 2019-11-10
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多