Rumah  >  Artikel  >  Java  >  Mengapakah PriorityQueue.toString() tidak menggambarkan susunan item dalam PriorityQueue dengan tepat?

Mengapakah PriorityQueue.toString() tidak menggambarkan susunan item dalam PriorityQueue dengan tepat?

Patricia Arquette
Patricia Arquetteasal
2024-10-31 05:25:02214semak imbas

Why does PriorityQueue.toString() not accurately reflect the order of items in a PriorityQueue?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn