我正在寻找一种解决方案,以按频率对字符进行排序。我有一些解决方案,但无法做到一行就可以了。
程序的完整代码为:
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?
答案 0 :(得分:1)
这是Java 8构造-lambda表达式。
https://www.tutorialspoint.com/java8/java8_lambda_expressions
PriorityQueue
构造函数之一采用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函数。每当将新元素插入优先级队列时,都会调用该方法以确定该新元素应在队列中的位置。