Java 菜鳥教程

Java 流程控制

Java 數(shù)組

Java 面向?qū)ο?I)

Java 面向?qū)ο?II)

Java 面向?qū)ο?III)

Java 異常處理

Java 列表(List)

Java Queue(隊(duì)列)

Java Map集合

Java Set集合

Java 輸入輸出(I/O)

Java Reader/Writer

Java 其他主題

Java PriorityQueue

在本教程中,我們將借助示例學(xué)習(xí)Java集合框架的PriorityQueue類。

PriorityQueue類提供堆數(shù)據(jù)結(jié)構(gòu)的功能。

它實(shí)現(xiàn)了Queue接口。

Java PriorityQueue類實(shí)現(xiàn)Queue接口。

與普通隊(duì)列不同,優(yōu)先隊(duì)列元素是按排序順序檢索的。

假設(shè)我們想以升序檢索元素。在這種情況下,優(yōu)先隊(duì)列的頭是最小的元素。檢索到該元素后,下一個(gè)最小的元素將成為隊(duì)列的頭。

需要注意的是,優(yōu)先隊(duì)列的元素可能沒有排序。但是,元素總是按排序順序檢索的。

創(chuàng)建PriorityQueue

為了創(chuàng)建優(yōu)先級(jí)隊(duì)列,我們必須導(dǎo)入java.util.PriorityQueue包。導(dǎo)入程序包后,可以使用以下方法在Java中創(chuàng)建優(yōu)先級(jí)隊(duì)列。

PriorityQueue<Integer> numbers = new PriorityQueue<>();

這里,我們創(chuàng)建了一個(gè)沒有任何參數(shù)的優(yōu)先級(jí)隊(duì)列。在這種情況下,優(yōu)先級(jí)隊(duì)列的頭是隊(duì)列中最小的元素。元素將按升序從隊(duì)列中移除。

但是,我們可以借助 Comparator 接口自定義元素的順序。我們將在本教程的后面部分中對(duì)此進(jìn)行了解。

PriorityQueue方法

PriorityQueue類提供了Queue接口中存在的所有方法的實(shí)現(xiàn)。

將元素插入PriorityQueue

  • add() - 將指定的元素插入隊(duì)列。如果隊(duì)列已滿,則會(huì)引發(fā)異常。

  • offer() - 將指定的元素插入隊(duì)列。如果隊(duì)列已滿,則返回false。

例如,

import java.util.PriorityQueue;

class Main {
    public static void main(String[] args) {

        //創(chuàng)建優(yōu)先隊(duì)列
        PriorityQueue<Integer> numbers = new PriorityQueue<>();

        //使用add()方法
        numbers.add(4);
        numbers.add(2);
        System.out.println("PriorityQueue: " + numbers);

        //使用offer()方法
        numbers.offer(1);
        System.out.println("更新后的PriorityQueue: " + numbers);
    }
}

輸出結(jié)果

PriorityQueue: [2, 4]
更新后的PriorityQueue: [1, 4, 2]

在這里,我們創(chuàng)建了一個(gè)名為的優(yōu)先級(jí)隊(duì)列numbers。我們已將4和2插入隊(duì)列。

雖然4被插入到2之前,但隊(duì)列的頭是2。這是因?yàn)閮?yōu)先級(jí)隊(duì)列的頭是隊(duì)列中最小的元素。

然后,我們將1插入隊(duì)列。 現(xiàn)在重新排列了隊(duì)列,以將最小的元素1存儲(chǔ)到隊(duì)列的開頭。

訪問PriorityQueue元素

要從優(yōu)先級(jí)隊(duì)列訪問元素,我們可以使用peek()方法。此方法返回隊(duì)列的頭部。例如,

import java.util.PriorityQueue;

class Main {
    public static void main(String[] args) {

        // 創(chuàng)建優(yōu)先級(jí)隊(duì)列
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        System.out.println("PriorityQueue: " + numbers);

        //使用 peek() 方法
        int number = numbers.peek();
        System.out.println("訪問元素: " + number);
    }
}

輸出結(jié)果

PriorityQueue: [1, 4, 2]
訪問元素: 1

刪除PriorityQueue元素

  • remove() - 從隊(duì)列中刪除指定的元素

  • poll() - 返回并刪除隊(duì)列的開頭

例如,

import java.util.PriorityQueue;

class Main {
    public static void main(String[] args) {

        // 創(chuàng)建優(yōu)先隊(duì)列
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        System.out.println("PriorityQueue: " + numbers);

        //使用remove()方法
        boolean result = numbers.remove(2);
        System.out.println("元素2是否已刪除? " + result);

        //使用poll()方法
        int number = numbers.poll();
        System.out.println("使用poll()刪除的元素: " + number);
    }
}

輸出結(jié)果

PriorityQueue: [1, 4, 2]
元素2是否已刪除? true
使用poll()刪除的元素: 1

遍歷PriorityQueue

要遍歷優(yōu)先級(jí)隊(duì)列的元素,我們可以使用iterator()方法。為了使用此方法,我們必須導(dǎo)入java.util.Iterator包。例如,

import java.util.PriorityQueue;
import java.util.Iterator;

class Main {
    public static void main(String[] args) {

        //創(chuàng)建優(yōu)先級(jí)隊(duì)列
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        System.out.print("使用iterator()遍歷PriorityQueue : ");

        //使用iterator()方法
        Iterator<Integer> iterate = numbers.iterator();
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

輸出結(jié)果

使用iterator()遍歷PriorityQueue : 1, 4, 2,

PriorityQueue其他方法

方法內(nèi)容描述
contains(element)在優(yōu)先級(jí)隊(duì)列中搜索指定的元素。如果找到該元素,則返回true,否則返回false。
size()返回優(yōu)先級(jí)隊(duì)列的長(zhǎng)度。
toArray()將優(yōu)先級(jí)隊(duì)列轉(zhuǎn)換為數(shù)組,并返回它。

PriorityQueue 比較器(comparator)

在以上所有示例中,優(yōu)先級(jí)隊(duì)列元素都是按自然順序(升序)檢索的。 但是,我們可以自定義此順序。

為此,我們需要?jiǎng)?chuàng)建自己的comparator類,它實(shí)現(xiàn)了Comparator接口。例如

import java.util.PriorityQueue;
import java.util.Comparator;
class Main {
    public static void main(String[] args) {

        //創(chuàng)建優(yōu)先級(jí)隊(duì)列
        PriorityQueue<Integer> numbers = new PriorityQueue<>(new CustomComparator());
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        numbers.add(3);
        System.out.print("PriorityQueue: " + numbers);
    }
}

class CustomComparator implements Comparator<Integer> {

    @Override
    public int compare(Integer number1, Integer number2) {
        int value =  number1.compareTo(number2);
        //元素以相反的順序排序
        if (value > 0) {
            return -1;
        }
        else if (value < 0) {
            return 1;
        }
        else {
            return 0;
        }
    }
}

輸出結(jié)果

PriorityQueue: [4, 3, 1, 2]

在上面的示例中,我們創(chuàng)建了一個(gè)優(yōu)先級(jí)隊(duì)列,將CustomComparator類作為參數(shù)傳遞。

CustomComparator類實(shí)現(xiàn)了Comparator接口。

然后,我們重寫compare()方法。該方法現(xiàn)在使元素的頭成為最大的數(shù)。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清