Rumah > Java > javaTutorial > Barisan keutamaan PriorityQueue rangka kerja koleksi Java

Barisan keutamaan PriorityQueue rangka kerja koleksi Java

WBOY
Lepaskan: 2022-06-09 11:47:57
ke hadapan
1887 orang telah melayarinya

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.

Barisan keutamaan PriorityQueue rangka kerja koleksi Java

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. Perkara penting apabila menggunakan PriorityQueue

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)

2. Pengenalan kepada Antara Muka Biasa PriorityQueue

1. Pembinaan Gilir Keutamaan

Berikut ialah beberapa kaedah pembinaan biasa dalam PriorityQueue, untuk yang lain, anda boleh merujuk kepada dokumentasi bantuan.

Buat baris gilir keutamaan dengan kapasiti awal InitialCapacity, Nota:initialCapacity tidak boleh kurang daripada 1, jika tidak, ia akan dilemparkan IllegalArgumentExceptionExceptionNormal
Pembina Pengenalan fungsi
PriorityQueue() td > Buat baris gilir keutamaan kosong,
构造器 功能介绍
PriorityQueue() 创建一个空的优先级队列,默认容量是11
PriorityQueue(int
initialCapacity)
创建一个初始容量为initialCapacity的优先级队列,注意:initialCapacity不能小于1,否则会抛IllegalArgumentException异
PriorityQueue(Collection extends E> c) 用一个集合来创建优先级队列
PriorityQueue(Comparator<? super E> comparator) 创建具有默认初始容量的优先级队列,并根据指定的比较器对其元素进行比较
PriorityQueue(int initialCapacity, Comparator <? super E> comparator)

创建一个初始容量为<strong>initialCapacity</strong>的优先级队列,根据指定的比较器对其元素进行比较

注意:initialCapacity不能小于1,否则会抛IllegalArgumentException异

Kapasiti lalai ialah 11
PriorityQueue(int initialCapacity)
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 &lt ;? super E> pembanding) Buat baris gilir keutamaan dengan kapasiti awal initialCapacity , bandingkan elemennya mengikut pembanding yang ditentukan oleh Nota: initialCapacity tidak boleh kurang daripada 1, jika tidak, IllegalArgumentException akan dibuangNormal

2. Perbandingan elemen dalam PriorityQueue

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?

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 pengguna

memasukkan objek jenis tersuai, kelas pembanding mesti disediakan dan kelas mesti melaksanakan antara muka Pembanding dan mengatasinya. membandingkan kaedah.

Kami melihat bahawa program melaporkan ralat di sini, mengapa? Kerana objek Kanak-kanak yang kami masukkan tidak boleh dibandingkan (

tidak melaksanakan antara muka Sebanding dan tidak menggunakan pembanding tersuai)

Anda boleh lihat

Maksudnya, 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 shiftUp

Teruskan 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

import 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

Jika anda mahu melaksanakan Dagen Heap mudah dikendalikan

Di atas kami telah melaksanakan antara muka Serasi, jadi bagaimana jika kami menyesuaikan pembanding umur?

class 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

3. Sisip/padam/dapatkan elemen keutamaan tertinggi
Nama fungsi Pengenalan fungsi
boolean

tawaran(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
函数名 功能介绍
boolean
offer(E e)
插入元素e,插入成功返回true,如果e对象为空,抛出NullPointerException异常,时
间复杂度 ,注意:空间不够时候会进行扩容
E peek() 获取优先级最高的元素,如果优先级队列为空,返回null
E poll() 移除优先级最高的元素并返回,如果优先级队列为空,返回null
int size() 获取有效元素的个数
void
clear()
清空

boolean 

isEmty()

检测优先级队列是否为空,为空返回true
clear()
Clear

boolean isEmty()

Mengesan sama ada baris gilir keutamaan kosong, kembali benar jika kosong
Kajian yang disyorkan: " tutorial video java》

Atas ialah kandungan terperinci Barisan keutamaan PriorityQueue rangka kerja koleksi Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:csdn.net
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan