PriorityQueue diurutkan tetapi yang terbesar [duplikat]
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());
KELUARAN:
[OSCAR 822, ALBERTO 827, DAVID 1523, JAVIER 943]
Saya mencari K Pasangan terbesar (nomor mereka) di hashtable dan yang ada di keluaran sebenarnya adalah yang benar. Pertanyaan saya adalah, mengapa dua yang terakhir ditukar?
Jawaban
PriorityQueuehanya mengembalikan elemen terendah dari kepalanya. Itu tidak mengurutkan semua elemen, jadi jika Anda melintasi antrian dengan pq.toString(), elemen mungkin tidak muncul secara berurutan. Ini terjadi karena, secara internal, PriorityQueue.toString()menggunakan PriorityQueue.iterator()metode dan, menurut dokumen:
The Iterator disediakan dalam metode
iterator()ini tidak dijamin untuk melintasi elemen dari antrian prioritas dalam urutan tertentu. Jika Anda membutuhkan traversal yang teratur, pertimbangkan untuk menggunakanArrays.sort(pq.toArray()).
Jika Anda ingin mencetak elemen antrian prioritas secara berurutan, Anda harus mengubah kode ini:
System.out.println(pq.toString());
Untuk berikut ini:
while (!pq.isEmpty())
System.out.println(pq.remove());
Metode toString () dari kelas PriorityQueue tidak menjamin Anda urutan elemen karena menggunakan iterator.
Anda dapat memeriksa pesanan menggunakan metode polling seperti di sini:
Cetak konten antrian prioritas [java]