Rumah  >  Artikel  >  Java  >  Mengapakah kaedah PriorityQueue `toString` Java tidak menggambarkan susunan elemen yang ditakrifkan oleh Comparator?

Mengapakah kaedah PriorityQueue `toString` Java tidak menggambarkan susunan elemen yang ditakrifkan oleh Comparator?

DDD
DDDasal
2024-11-04 05:04:29971semak imbas

Why does Java's PriorityQueue `toString` method not reflect the element order defined by the Comparator?

Cara PriorityQueue's toString Method Mengelirukan Tafsiran Tertib Elemen

Di Java, struktur data PriorityQueue mengekalkan timbunan binari untuk mengutamakan elemen berdasarkan yang ditetapkan strategi perbandingan. Strategi ini biasanya dilaksanakan melalui Pembanding tersuai, seperti yang dilihat dalam coretan kod yang disediakan. Walau bagaimanapun, terdapat salah tanggapan yang lazim mengenai susunan elemen apabila memeriksa output kaedah toString PriorityQueue.

Kaedah toString direka bentuk untuk menyediakan perwakilan teks kandungan PriorityQueue. Walau bagaimanapun, ia tidak secara tersirat menguatkuasakan susunan keutamaan yang ditakrifkan oleh Pembanding. Sebaliknya, ia hanya memaparkan elemen dalam kedudukan semasanya dalam timbunan, yang mungkin tidak sejajar dengan tertib diisih yang dijangkakan.

Dalam contoh yang diberikan, PriorityQueue dimulakan dengan Comparator tersuai untuk mengutamakan nilai kekerapan. Anda bertujuan output untuk mencerminkan susunan ini, dengan elemen yang mempunyai frekuensi yang lebih rendah disenaraikan dahulu. Walau bagaimanapun, output kaedah toString menunjukkan susunan yang salah, nampaknya bercanggah dengan keutamaan yang dimaksudkan.

Punca percanggahan ini berpunca daripada struktur dalaman timbunan binari. Walaupun ia mengekalkan susunan separa, unsur-unsur tidak diisih sepenuhnya sehingga ia dialih keluar daripada timbunan. Kaedah toString mendapatkan semula elemen terus daripada timbunan tanpa melakukan pengisihan ini, yang membawa kepada output yang diperhatikan.

Untuk menangani isu ini dan mendapatkan susunan disusun yang betul, adalah perlu untuk mengekstrak elemen daripada PriorityQueue satu demi satu. satu. Kaedah poll() melakukan ini, mengalih keluar elemen daripada timbunan dan mengembalikannya. Dengan mengulangi PriorityQueue menggunakan poll() dan mencetak elemen yang dikembalikan, anda boleh mendapatkan susunan yang diisih seperti yang dimaksudkan.

Oleh itu, kod yang betul untuk mencetak elemen dalam susunan yang diisih ialah:

<code class="java">while (!queue.isEmpty()) {
   System.out.println(queue.poll());
}</code>

Ini akan mencetak elemen dalam tertib menaik bagi frekuensinya, seperti yang ditakrifkan oleh Pembanding.

Atas ialah kandungan terperinci Mengapakah kaedah PriorityQueue `toString` Java tidak menggambarkan susunan elemen yang ditakrifkan oleh Comparator?. 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