PriorityQueue.toString() Ordering Anomaly: Explained
Apabila cuba mendapatkan semula elemen daripada PriorityQueue, anda mungkin menghadapi tingkah laku yang tidak dijangka di mana output pesanan tidak sejajar dengan keutamaan yang diharapkan. Ini kerana PriorityQueue.toString() hanya menyediakan petikan keadaan dalaman baris gilir, yang mungkin tidak mewakili susunan yang diisih.
Untuk menangani isu ini, dan bukannya bergantung pada toString(), anda harus membuat tinjauan pendapat item daripada baris gilir satu demi satu menggunakan kaedah poll(). Inilah sebabnya:
Struktur Timbunan dan Susunan Gilir
Secara dalaman, PriorityQueue menggunakan struktur data timbunan untuk mengekalkan susunan yang diisih dengan cekap. Walau bagaimanapun, timbunan tidak diisih sepenuhnya pada setiap masa. Sebaliknya, ia adalah pepohon tersusun separa, di mana setiap nod dibandingkan dengan induk dan anak-anaknya.
Apabila anda menambah atau mengalih keluar item daripada baris gilir, timbunan mengalami pelarasan untuk mengekalkan susunan separa ini. Akibatnya, memanggil toString() pada baris gilir hanya akan menunjukkan petikan keadaan semasa, yang mungkin tidak sejajar dengan susunan keutamaan yang dijangkakan.
Penyelesaian: Menggunakan Poll()
Untuk mendapatkan elemen dalam susunan yang disusun, anda harus meninjaunya satu persatu menggunakan kaedah poll(). Kaedah poll() beroperasi di bahagian atas timbunan, mengalih keluar nod akar sambil mengekalkan susunan nod yang tinggal.
Contoh Kod
Untuk menggambarkan ini, pertimbangkan pengubahsuaian berikut pada kod anda:
<code class="java">import java.util.Comparator; import java.util.PriorityQueue; public class TreeNodeHuffman { public static void main(String[] args) { HuffmanComparator compare = new HuffmanComparator(); // Create and initialize PriorityQueue PriorityQueue<TreeNodeHuffman> queue = new PriorityQueue<>(26, compare); // ... Add nodes to the queue // Poll and print items while (!queue.isEmpty()) { System.out.println(queue.poll()); } } }</code>
Dengan menggunakan kaedah poll(), anda kini boleh melihat unsur-unsur dalam tertib diisih kerana ia dialih keluar daripada baris gilir:
[z, q, x, j, k, v, b, m, i, c, e, s, o, w, a, r, h, p, t, l, a]
Ini sejajar dengan jangkaan anda untuk mendapatkan elemen dengan frekuensi terendah dahulu.
Atas ialah kandungan terperinci Mengapakah PriorityQueue.toString() tidak menggambarkan susunan item dalam PriorityQueue dengan tepat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!