English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Учебник по основам Java

Java Управление потоком

Java Массив

Java Ориентированное на объекты (I)

Java Ориентированное на объекты (II)

Java Ориентированное на объекты (III)

Обработка исключений в Java

Java Список (List)

Java Queue (очередь)

Java Map коллекция

Java Set коллекция

Java Вход/Вывод (I/O)

Java Reader/Writer

Другие темы Java

PriorityQueue в Java

В этом руководстве мы будем изучать класс PriorityQueue из Java Collections Framework с помощью примеров.

Класс PriorityQueue предоставляет функции структуры данных堆.

Он реализуетИнтерфейс Queue.

В отличие от обычной очереди, элементы приоритетной очереди извлекаются в порядке сортировки.

Предположим, что мы хотим извлекать элементы в порядке возрастания. В этом случае, головным элементом приоритетной очереди является наименьший элемент. После извлечения этого элемента, следующий наименьший элемент становится головным элементом очереди.

需要注意的是,элементы приоритетной очереди могут не быть отсортированы. Однако элементы всегда извлекаются в порядке сортировки.

Создание PriorityQueue

Чтобы создать приоритетную очередь,我们必须 импортировать пакет java.util.PriorityQueue. После импорта пакета, вы можете создать приоритетную очередь с помощью следующих методов в Java.

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

Здесь мы создали приоритетную очередь без параметров. В этом случае, головным элементом приоритетной очереди является наименьший элемент в очереди. Элементы будут удаляться из очереди в порядке возрастания.

Но мы можем использовать интерфейс Comparator, чтобы определить порядок элементов. Мы рассмотрим это в более поздней части руководства.

Метод PriorityQueue

Класс PriorityQueue предоставляет реализацию всех методов интерфейса Queue.

Вставка элемента в PriorityQueue

  • add() - вставляет указанный элемент в очередь. Возвращает false, если очередь полна.

  • offer() - вставляет указанный элемент в очередь. Возвращает false, если очередь полна.

Например:

import java.util.PriorityQueue;
class Main {
    public static void main(String[] args) {
        //Создание приоритетной очереди
        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);
    }
}

Результат вывода

PriorityQueue: [2, 4]
Обновленная PriorityQueue: [1, 4, 2]

Здесь мы создали приоритетную очередь с именем numbers. Мы уже вставили 4 и 2 в очередь.

Хотя 4 был вставлен перед 2, голова очереди - это 2. Это потому, что голова приоритетной очереди - это наименьший элемент в очереди.

Затем мы вставляем 1 в очередь. Теперь очередь была реорганизована, чтобы поместить наибольший элемент 1 в начало очереди.

Адрес элемента PriorityQueue

Чтобы получить элемент из приоритетной очереди, мы можем использовать метод peek(). Этот метод возвращает элемент в начале очереди. Например:

import java.util.PriorityQueue;
class Main {
    public static void main(String[] args) {
        //Создание приоритетной очереди
        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);
    }
}

Результат вывода

PriorityQueue: [1, 4, 2]
Адрес элемента: 1

Удаление элемента из PriorityQueue

  • remove() - удаляет указанный элемент из очереди

  • poll() - возвращает и удаляет элемент в начале очереди

Например:

import java.util.PriorityQueue;
class Main {
    public static void main(String[] args) {
        //Создание приоритетной очереди
        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);
    }
}

Результат вывода

PriorityQueue: [1, 4, 2]
Удален ли элемент 2? true
Элемент, удаленный с помощью poll(): 1

Прогонка PriorityQueue

Чтобы пройтись по элементам приоритетной очереди, мы можем использовать метод iterator(). Для использования этого метода我们必须 импортировать пакет java.util.Iterator. Например,

import java.util.PriorityQueue;
import java.util.Iterator;
class Main {
    public static void main(String[] args) {
        // Создание приоритетной очереди
        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(", ");
        }
    }
}

Результат вывода

Использование iterator() для遍ения PriorityQueue: 1, 4, 2,

Другие методы PriorityQueue

МетодОписание содержимого
contains(element)Поиск заданного элемента в приоритетной очереди. Если элемент найден, то возвращает true,否则 false.
size()Возвращает размер приоритетной очереди.
toArray()Преобразует приоритетную очередь в массив и возвращает его.

Сравнитель (comparator) PriorityQueue

Во всех вышеперечисленных примерах элементы приоритетной очереди отсортированы по естественному порядку (в порядке возрастания). Но мы можем настроить этот порядок.

Для этого нам нужно создать свой класс comparator, который реализует интерфейс Comparator. Например

import java.util.PriorityQueue;
import java.util.Comparator;
class Main {
    public static void main(String[] args) {
        // Создание приоритетной очереди
        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;
        }
    }
}

Результат вывода

PriorityQueue: [4, 3, 1, 2]

В примере выше мы создали приоритетную очередь, передавая класс CustomComparator в качестве параметра.

Класс CustomComparator реализует интерфейс Comparator.

Затем мы перезаписываем метод compare(). Этот метод теперь делает голову элемента максимальным числом.