[英]Understanding Comparator in Java PriorityQueue
我有以下代碼:
HashMap<Character, Integer> charCount = new HashMap<Character, Integer>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
charCount.put(c, charCount.getOrDefault(c, 0) + 1);
}
PriorityQueue<Character> maxHeap = new PriorityQueue((a, b) -> charCount.get(b) - charCount.get(a));
maxHeap.addAll(charCount.keySet());
maxHeap 清楚地將元素排序為從最高頻率到最低頻率,但我不明白比較器功能。 我發現這里的語法(a, b) -> charCount.get(b) - charCount.get(a)
非常令人困惑,我希望有人能夠了解這實際上是如何比較元素以將它們分類到這個 maxHeap 中的。 謝謝!
(a, b) -> charCount.get(b) - charCount.get(a)
是所謂的 lambda 語法。 這是語法糖*:
new Comparator<Character>() {
public int compare(Character a, Character b) {
return charCount.get(b) - charCount.get(a);
}
}
這反過來又是語法糖:
class MyCharacterComparator implements Comparator<Character> {
public int compare(Character a, Character b) {
return charCount.get(b) - charCount.get(a);
}
}
PriorityQueue<Character> maxHeap = new PriorityQueue(new MyCharacterComparator());
但這一切都歸結為同一件事:它代表了charCount.get(b) - charCount.get(a)
。 不是那個計算的結果,而是計算本身。 您將計算作為一個概念傳遞給 PriorityQueue 的構造函數,然后 PriorityQueue 將根據需要多次調用此代碼,並傳入完成工作所需的任何內容。
在這種情況下, charCount
將給定的字符映射到該字符在 String s
頻率。 然后比較器將檢索第二個參數和第一個參數的“頻率”(或字符數),然后計算差異(count(b) - count(a))。 比較器方法的工作原理如下:如果結果為負,則 'a' 在 'b' 之前。 如果它是正數,則 'a' 在 'b' 之后。 如果相等,則 'a' 和 'b' 在同等基礎上進行比較。
因此,如果變量 'b' 的字符出現了 10 次,而變量 'a' 的字符出現了 8 次,那么您計算10 - 8
,這是一個正數,這意味着 'b ' 被認為在 a 之前排序(排序較早;較低)。
因此,它優先考慮出現頻率更高的字符。
*) 不是完全; 使用例如javap
檢查類文件,您會發現它的結果有所不同,並且還有一些其他差異。 但這幾乎是一樣的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.