Artikel ini membawakan anda pengetahuan yang berkaitan tentang java, yang terutamanya memperkenalkan pengetahuan yang berkaitan tentang baris gilir keutamaan PriorityQueue Rangka kerja koleksi Java menyediakan dua jenis keutamaan, PriorityQueue dan PriorityBlockingQueue, PriorityQueue ialah thread-. tidak selamat, dan PriorityBlockingQueue adalah selamat untuk rangkaian. Mari kita lihat bersama-sama.
Pembelajaran yang disyorkan: "tutorial video java"
Rangka kerja koleksi Java menyediakan dua jenis: PriorityQueue dan PriorityBlockingQueue Priority queue, PriorityQueue adalah thread-unsafe, dan PriorityBlockingQueue adalah thread-safe Artikel ini terutamanya memperkenalkan PriorityQueue
Hubungan priorityQueue dalam rangka kerja koleksi Java adalah seperti berikut:
1. Apabila menggunakannya, anda mesti mengimport pakej di mana PriorityQueue terletak, iaitu:
import java util.PriorityQueue
2. Elemen yang diletakkan dalam PriorityQueue mestilah setanding saiznya dan objek yang tidak boleh dibandingkan saiznya tidak boleh disisipkan, jika tidak
pengecualian ClassCastException akan dilemparkan
3 Objek null tidak boleh disisipkan, jika tidak NullPointerException akan dilemparkan
4 masukkan sebarang bilangan elemen, dan kapasiti dalaman boleh dikembangkan secara automatik
5 Kerumitan masa untuk memasukkan dan memadam elemen ialah log base 2 n
6 lapisan asas PriorityQueue menggunakan struktur data timbunan
7 secara lalai Ia adalah timbunan kecil --- iaitu, elemen yang diperolehi setiap kali ialah elemen terkecil ( Jika kita ingin mengubahnya. ke dalam timbunan yang besar, kita perlu membandingkan semula kaedah. Kaedah perbandingan lalai ialah kaedah compareTo dalam antara muka Sebanding)
Berikut ialah beberapa kaedah pembinaan biasa dalam PriorityQueue, untuk yang lain, anda boleh merujuk kepada dokumentasi bantuan.
Pembina | Pengenalan fungsi | ||||||||||||
PriorityQueue() td > | Buat baris gilir keutamaan kosong,
|
||||||||||||
PriorityQueue(int initialCapacity) | Buat baris gilir keutamaan dengan kapasiti awal InitialCapacity, Nota:initialCapacity tidak boleh kurang daripada 1, jika tidak, ia akan dilemparkan IllegalArgumentExceptionExceptionNormal|||||||||||||
PriorityQueue(Collection<🎜> extends E> c) | Gunakan koleksi untuk mencipta baris gilir keutamaan | ||||||||||||
PriorityQueue(Comparator<? super E> comparator) |
Buat dengan permulaan lalai kapasiti Barisan keutamaan dan membandingkan elemennya mengikut pembanding yang ditentukan oleh | ||||||||||||
PriorityQueue(int initialCapacity, Comparator < ;? super E> pembanding) |
Buat baris gilir keutamaan dengan kapasiti awal |
Selepas membaca kaedah pembinaan, mari kita fikirkan soalan sekali lagi
Bagaimanakah barisan keutamaan mencapai pesanan? Kerana barisan keutamaan dilaksanakan dengan bantuan timbunan akar kecil
Dalam proses melaksanakan timbunan akar kecil, kita tahu bahawa perbandingan elemen mesti berlaku, jadi elemen dalam PriorityQueue mesti boleh membandingkan dalam saiz. Jadi bagaimanakah PriorityQueue membandingkan elemen?
Kami melihat bahawa program melaporkan ralat di sini, mengapa? Kerana objek Kanak-kanak yang kami masukkan tidak boleh dibandingkan (PriorityQueue menggunakan:
Setanding dan Pembanding.1. Comparble ialah kaedah perbandingan dalaman lalai Jika pengguna memasukkan objek jenis tersuai , objek mesti melaksanakan antara muka Comparble dan mengatasi Kaedah compareTo
2. Pengguna juga boleh memilih untuk menggunakan objek pembanding Jika penggunamemasukkan objek jenis tersuai, kelas pembanding mesti disediakan dan kelas mesti melaksanakan antara muka Pembanding dan mengatasinya. membandingkan kaedah.
tidak melaksanakan antara muka Sebanding dan tidak menggunakan pembanding tersuai)
Anda boleh lihatMaksudnya, kami menggunakan kaedah perbandingan lalai compareTo dalam antara muka Sebanding
Pada masa ini kita lihat pada ralat lagi Maklumat
Nampaknya ada masalah apabila memasukkan elemen ke dalam PriorityQueue
Kemudian mari kita buka kod sumber PriorityQueue dan lihat (Berikut ialah kod sumber kaedah tawaran dalam PriorityQueue)
Lihat semula kod sumber shiftUpTeruskan klik dalam SiftupComparable
pada masa ini, mari kita lihat semula objek kanak -kanak yang kita masukkan ke dalam keutamaan Ia tidak mempunyai pembanding tersuai dan tidak melaksanakan antara muka Sebanding ,
Sudah tentu ia melaporkan ralat! Kalau begitu, mari kita laksanakan antara muka Setanding dalam kelas Kanak-kanak dan bandingkan mengikut umur
Jika anda mahu melaksanakan Dagen Heap mudah dikendalikanimport java.util.PriorityQueue; class Child implements Comparable<Child>{ int age; String name; public Child(int age, String name) { this.age = age; this.name = name; } @Override public int compareTo(Child o) { return this.age - o.age; // 默认实现小根堆 } @Override public String toString() { return "Child{" + "age=" + age + ", name='" + name + '\'' + '}'; } } public class TestPriorityQueue { public static void main(String[] args) { PriorityQueue<Child> priorityQueue = new PriorityQueue<>(); priorityQueue.offer(new Child(12, "小亮")); priorityQueue.offer(new Child(11, "小红")); priorityQueue.offer(new Child(8, "小强")); System.out.println(priorityQueue); } }Salin selepas log masuk
Di atas kami telah melaksanakan antara muka Serasi, jadi bagaimana jika kami menyesuaikan pembanding umur?
3. Sisip/padam/dapatkan elemen keutamaan tertinggiclass Child { int age; String name; public Child(int age, String name) { this.age = age; this.name = name; } @Override public String toString() { return "Child{" + "age=" + age + ", name='" + name + '\'' + '}'; } } class AgeComparator implements Comparator<Child> { @Override public int compare(Child o1, Child o2) { return o1.age - o2.age; // 实现小根堆 // return o2.ae - o1.age 实现大根堆 } } public class TestPriorityQueue { public static void main(String[] args) { AgeComparator ageComparator = new AgeComparator(); // 创建具有默认初始容量的 PriorityQueue ,并根据指定的比较器对其元素进行排序。 PriorityQueue<Child> priorityQueue = new PriorityQueue<>(ageComparator); // 可以看到这里我的Child对象虽然没有实现Comparable接口,但因为我们对Child对象自定义了一个年龄比较器,所以插入元素不会报错 priorityQueue.offer(new Child(12, "小亮")); priorityQueue.offer(new Child(11, "小红")); priorityQueue.offer(new Child(8, "小强")); System.out.println(priorityQueue); } }Salin selepas log masuk
Nama fungsi | Pengenalan fungsi | ||||||||||||||
booleantawaran(E e) |
Sisipkan elemen e , sisipan berjaya dan mengembalikan benar. Jika objek e kosong, pengecualian NullPointerException dilemparkan, kerumitan masa, nota: pengembangan akan dilakukan apabila ruang tidak mencukupi | ||||||||||||||
E peek( ) | Dapatkan elemen dengan keutamaan tertinggi Jika baris gilir keutamaan kosong, kembalikan null | ||||||||||||||
E poll() | Shift Alih keluar elemen dengan keutamaan tertinggi dan kembalikan Jika baris gilir keutamaan kosong, kembalikan null | ||||||||||||||
int size() | Dapatkan. bilangan elemen yang sah | ||||||||||||||
void
|
Clear | ||||||||||||||
Mengesan sama ada baris gilir keutamaan kosong, kembali benar jika kosong |
Atas ialah kandungan terperinci Barisan keutamaan PriorityQueue rangka kerja koleksi Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!