PriorityQueueはソートされていますが、2つの最大の[重複]

Nov 25 2020
public class Pair implements Comparable<Pair>{
    public String name;
    public int number;

    public int compareTo(Pair other) {
        if (other == null) {
            return 1;
        }
        return Integer.compare(number, other.number);
    }
}
ht = new Hashtable<String, Pair>(perLen);
PriorityQueue<Pair> pq = new PriorityQueue<Pair>(k);
set = ht.keySet();
for (String i: set) {
        tmp0 = ht.get(i);
        if (tmp0.compareTo(pq.peek()) > 0) {
            if (pq.size() == k) {
                pq.remove();
            }
            pq.add(tmp0);
        }
}
System.out.println(pq.toString());

出力:

[OSCAR 822, ALBERTO 827, DAVID 1523, JAVIER 943]

ハッシュテーブルでk個の最大のペア(それらの数)を探していますが、出力のペアは実際には正しいものです。私の質問は、なぜ最後の2つが交換されるのですか?

回答

2 fps Nov 25 2020 at 11:38

PriorityQueue頭から最も低い要素のみを返します。すべての要素が並べ替えられるわけではないため、キューをpq.toString()でトラバースすると、要素が順番に表示されない場合があります。これは、内部的にメソッドをPriorityQueue.toString()使用PriorityQueue.iterator()し、ドキュメントによると、次の理由で発生します。

メソッドiterator()で提供されるイテレータは、優先キューの要素を特定の順序でトラバースすることが保証されていません。順序付きトラバーサルが必要な場合は、の使用を検討してくださいArrays.sort(pq.toArray())

優先キューの要素を順番に出力する場合は、次のコードを変更する必要があります。

System.out.println(pq.toString());

以下へ:

while (!pq.isEmpty()) 
    System.out.println(pq.remove());
1 BrightSoul Nov 25 2020 at 11:32

PriorityQueueクラスのtoString()メソッドは、イテレーターを使用するため、要素の順序を保証するものではありません。

Ashish Nov 25 2020 at 11:28

次のように、pollメソッドを使用して順序を確認できます。

優先キューの内容を出力する[java]