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]