簡體   English   中英

了解 Java PriorityQueue 中的比較器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM