java - 对优先队列中的这条线感到困惑
问题描述
我正在寻找按频率对字符进行排序的问题的解决方案。我得到了一些解决方案,但无法完成一行。
该程序的完整代码是:
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?
解决方案
这是一个 Java 8 构造 - 一个 lambda 表达式。
https://www.tutorialspoint.com/java8/java8_lambda_expressions
其中一个PriorityQueue
构造函数将 aComparator
作为参数:
Comparator
是一个功能接口,这意味着它声明了一个抽象方法。一个函数式接口可以通过定义一个 lambda 表达式来实现。这就是代码中发生的事情。
您可以将 lambda 表达式视为的直接实现
int compare(T o1, T o2)
接口的方法Comparator
。
推荐阅读
- jsx - 如何编译不使用子代的 Reason JSX 函数
- protractor - 拥有将在一个位置的每次测试之前运行的代码
- android - 无法从 build.gradle 更新 Android Studio for mac 中的版本代码
- javascript - D3 mousedown 事件删除错误的节点
- javascript - 参数未传递到 TabNavigator 中的子屏幕
- debugging - 如何消除全局变量
- android - 当多个用户使用同一设备访问同一应用程序时如何处理 Firebase 注册 ID(令牌)
- ruby-on-rails - 如何创建一个选择字段,在 Rails 中动态加载元素以实现多对多关联?
- javascript - 从 PHP 页面获取结果
- asp.net-core - 生产中的重定向 URL 不正确