Класс PriorityQueue Java: Руководство для начинающих

Введение

Привет, будущие программисты Java! Сегодня мы погружаемся в увлекательный мир PriorityQueue в Java. Не волнуйтесь, если вы раньше не слышали об этом — мы начнем с нуля и постепенно развиваться вместе. Представьте себе PriorityQueue как особую очередь (или линию), где самый важный человек (или элемент) всегда идет первым. Волнующе, правда? Давайте начнем!

Java - PriorityQueue

Объявление класса

В Java класс PriorityQueue является частью Java Collections Framework. Это как VIP-список для ваших данных! Вот как его объявляют:

import java.util.PriorityQueue;

PriorityQueue<ElementType> pq = new PriorityQueue<>();

Замените ElementType на тип данных, который вы хотите хранить, например Integer, String или даже ваши собственные пользовательские объекты (об этом позже).

Параметры

При создании PriorityQueue можно указать несколько необязательных параметров:

  1. Начальная емкость: Количество элементов, которые он может содержать изначально.
  2. Компаратор: Специальный объект, который определяет порядок элементов.

Вот пример:

PriorityQueue<Integer> pq = new PriorityQueue<>(10, Collections.reverseOrder());

Это создает PriorityQueue, который изначально может содержать 10 целых чисел, и они будут упорядочены от большего к меньшему.

Конструкторы класса

PriorityQueue имеет несколько конструкторов. Представьте себе конструкторы как разные рецепты для создания вашей очереди. Вот основные из них:

Конструктор Описание
PriorityQueue() Создает пустую очередь с 默认ной начальной емкостью (11)
PriorityQueue(int initialCapacity) Создает пустую очередь с указанной начальной емкостью
PriorityQueue(Comparator<? super E> comparator) Создает пустую очередь с указанным компаратором
PriorityQueue(Collection<? extends E> c) Создает очередь, содержащую элементы указанного коллекции

Посмотрим на пример:

PriorityQueue<String> fruitQueue = new PriorityQueue<>();
PriorityQueue<Integer> numberQueue = new PriorityQueue<>(20);

В первой строке мы создаем очередь для строк (возможно, имена фруктов?). Во второй — очередь для чисел, которая изначально может содержать 20 элементов.

Методы класса

Теперь рассмотрим некоторые из интересных вещей, которые можно сделать с PriorityQueue:

Метод Описание
add(E e) Добавляет элемент в очередь
offer(E e) Добавляет элемент в очередь (возвращает false, если полна)
peek() Возвращает, но не удаляет, голову очереди
poll() Возвращает и удаляет голову очереди
remove(Object o) Удаляет один экземпляр указанного элемента
size() Возвращает количество элементов в очереди
clear() Удаляет все элементы из очереди

Посмотрим на это в действии:

PriorityQueue<String> animalQueue = new PriorityQueue<>();

animalQueue.add("Dog");
animalQueue.offer("Cat");
animalQueue.add("Elephant");

System.out.println("Peek: " + animalQueue.peek()); // Выводит: Peek: Cat
System.out.println("Poll: " + animalQueue.poll()); // Выводит: Poll: Cat
System.out.println("Size: " + animalQueue.size()); // Выводит: Size: 2

Заметили, как "Cat" был первым? Это потому что PriorityQueue сортирует строки алфавитным порядком по умолчанию.

Наследуемые методы

PriorityQueue также наследует методы от своих родительских классов. Это как получение бонусных функций! Некоторые полезные из них включают:

  • contains(Object o): Проверяет, содержит ли очередь указанный элемент
  • toArray(): Возвращает массив, содержащий все элементы в очереди
  • iterator(): Возвращает итератор по элементам в очереди

Вот быстрый пример:

PriorityQueue<Integer> numberQueue = new PriorityQueue<>();
numberQueue.add(5);
numberQueue.add(2);
numberQueue.add(8);

System.out.println("Contains 2? " + numberQueue.contains(2)); // Выводит: Contains 2? true

Object[] array = numberQueue.toArray();
System.out.println("First element: " + array[0]); // Выводит: First element: 2

Пример добавления элемента в PriorityQueue

Поместим все вместе с веселым примером. Представьте, что мы организуем вечеринку, и мы хотим приветствовать наших гостей в порядке их прибытия:

import java.util.PriorityQueue;

public class PartyGreeter {
public static void main(String[] args) {
PriorityQueue<Guest> guestQueue = new PriorityQueue<>();

guestQueue.add(new Guest("Alice", 18.30));
guestQueue.add(new Guest("Bob", 18.15));
guestQueue.add(new Guest("Charlie", 18.45));

while (!guestQueue.isEmpty()) {
Guest guest = guestQueue.poll();
System.out.println("Welcome, " + guest.name + "! You arrived at " + guest.arrivalTime);
}
}

static class Guest implements Comparable<Guest> {
String name;
double arrivalTime;

Guest(String name, double arrivalTime) {
this.name = name;
this.arrivalTime = arrivalTime;
}

@Override
public int compareTo(Guest other) {
return Double.compare(this.arrivalTime, other.arrivalTime);
}
}
}

Эта программа выведет:

Welcome, Bob! You arrived at 18.15
Welcome, Alice! You arrived at 18.3
Welcome, Charlie! You arrived at 18.45

В этом примере мы создали пользовательский класс Guest и сообщили Java, как сравнивать гостей на основе их времени прибытия. PriorityQueue затем автоматически отсортировал наших гостей!

И вот и все! Вы только что сделали свои первые шаги в мире PriorityQueues в Java. Помните, практика совершенства, так что не стесняйтесь экспериментировать с этими концепциями. Кто знает? Может быть, вы будете использовать PriorityQueue для организации списка гостей на вашей следующей вечеринке!

Credits: Image by storyset