
Интерфейс Queue и классы
1. Интерфейс Queue
Интерфейс Queue расширяет Collection и объявляет поведение очередей, которые представляют собой список с дисциплиной "первый вошел, первый вышел" (FIFO). Существуют разные типы очередей, в которых порядок основан на некотором критерии. Очереди не могут хранить значения null.
Методы интерфейса Queue:
- Е element() - возвращает элемент из головы очереди. Элемент не удаляется. Если очередь пуста, инициируется исключение NoSuchElementException.
- Е remove() - удаляет элемент из головы очереди, возвращая его. Инициирует исключение NoSuchElementException, если очередь пуста.
- Е peek() - возвращает элемент из головы очереди. Возвращает null, если очередь пуста. Элемент не удаляется.
- Е роll() - возвращает элемент из головы очереди и удаляет его. Возвращает null, если очередь пуста.
- boolean offer(Е оbj) - пытается добавить оbj в очередь. Возвращает true, если оbj добавлен, и false в противном случае.
Пример 1. Методы offer(), peek(), poll() интерфейса Queue
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.offer("Харьков");
queue.offer("Киев");
queue.offer("Кременчуг");
queue.offer("Львов");
System.out.println(queue.peek());
String town;
while ((town = queue.poll()) != null) {
System.out.println(town);
}
}
}
2. Интерфейс Deque
Интерфейс Deque появился в Java 6. Он расширяет Queue и описывает поведение двунаправленной очереди. Двунаправленная очередь может функционировать как стандартная очередь FIFO либо как стек LIFO.
Методы интерфейса Deque:
- void addFirst(Е obj) - добавляет obj в голову двунаправленной очереди. Возбуждает исключение IllegalStateException, если в очереди ограниченной емкости нет места.
- void addLast(Е obj) - добавляет obj в хвост двунаправленной очереди. Возбуждает исключение IllegalStateException, если в очереди ограниченной емкости нет места.
- Е getFirst() - возвращает первый элемент двунаправленной очереди. Объект из очереди не удаляется. В случае пустой двунаправленной очереди возбуждает исключение NoSuchElementException.
- Е getLast() - возвращает последний элемент двунаправленной очереди. Объект из очереди не удаляется. В случае пустой двунаправленной очереди возбуждает исключения NoSuchElementException.
- boolean offerFirst(Е obj) - пытается добавить obj в голову двунаправленной очереди. Возвращает true, если obj добавлен, и false в противном случае. Таким образом, этот метод возвращает false при попытке добавить obj в полную двунаправленную очередь ограниченной емкости.
- boolean offerLast(E obj) - пытается добавить obj в хвост двунаправленной очереди. Возвращает true, если obj добавлен, и false в против ном случае.
- Е рор() - возвращает элемент, находящийся в голове двунаправленной очереди, одновременно удаляя его из очереди. Возбуждает исключение NoSuchElementException, если очередь пуста.
- void push(Е obj) - добавляет элемент в голову двунаправленной очереди. Если в очереди фиксированного объема нет места, возбуждает исключение IllegalStateException.
- Е peekFirst() - возвращает элемент, находящийся в голове двунаправленной очереди. Возвращает null, если очередь пуста. Объект из очереди не удаляется.
- Е peekLast() - возвращает элемент, находящийся в хвосте двунаправленной очереди. Возвращает null, если очередь пуста. Объект из очереди не удаляется.
- Е pollFirst() - возвращает элемент, находящийся в голове двунаправленной очереди, одновременно удаляя его из очереди. Возвращает null, если очередь пуста.
- Е pollLast() - возвращает элемент, находящийся в хвосте двунаправленной очереди, одновременно удаляя его из очереди. Возвращает null, если очередь пуста.
- Е removeLast() - возвращает элемент, находящийся в конце двунаправленной очереди, удаляя его в процессе. Возбуждает исключение NoSuchElementException, если очередь пуста.
- Е removeFirst() - возвращает элемент, находящийся в голове двунаправленной очереди, одновременно удаляя его из очереди. Возбуждает исключение NoSuchElementException, если очередь пуста.
- boolean removeLastOccurrence(Object obj) - удаляет последнее вхождение obj из двунаправленной очереди. Возвращает true в случае успеха и false если очередь не содержала obj.
- boolean removeFirstOccurrence(Object obj) - удаляет первое вхождение obj из двунаправленной очереди. Возвращает true в случае успеха и false, если очередь не содержала obj.
3. Класс ArrayDeque
ArrayDeque создает двунаправленную очередь.
Конструкторы класса ArrayDeque:
- ArrayDeque() - создает пустую двунаправленную очередь с вместимостью 16 элементов.
- ArrayDeque(Collection<? extends E> c) - создает двунаправленную очередь из элементов коллекции c в том порядке, в котором они возвращаются итератором коллекции c.
- ArrayDeque(int numElements) - создает пустую двунаправленную очередь с вместимостью numElements.
Пример 2. Использование класса ArrayDeque
import java.util.ArrayDeque;
import java.util.Deque;
public class ArrayDequeExample {
public static void main(String[] args) {
Deque<String> stack = new ArrayDeque<>();
Deque<String> queue = new ArrayDeque<>(2);
stack.push("A");
stack.push("B");
stack.push("C");
stack.push("D");
while (!stack.isEmpty()) {
System.out.print(stack.pop() + " ");
}
System.out.println();
queue.add("A");
queue.add("B");
queue.add("C");
queue.add("D");
while (!queue.isEmpty()) {
System.out.print(queue.remove() + " ");
}
}
}
4. Класс LinkedList
Класс LinkedList реализует интерфейсы сразу два интерфейса - List, Deque. LinkedList – это двусвязный список.
Конструкторы класса LinkedList:
- LinkedList()
- LinkedList(Collection<? extends Е> с)
Внутри класса LinkedList существует static inner класс Entry, с помощью которого создаются новые элементы:
private static class Entry<E>
{
E element;
Entry<E> next;
Entry<E> prev;
Entry(E element, Entry<E> next, Entry<E> prev)
{
this.element = element;
this.next = next;
this.prev = prev;
}
}
Из LinkedList можно организовать стек, очередь, или двойную очередь, со временем доступа O(1). На вставку и удаление из середины списка, получение элемента по индексу или значению потребуется линейное время O(n). Однако, на добавление и удаление из середины списка, используя ListIterator.add() и ListIterator.remove(), потребуется O(1). Позволяет добавлять любые значения, в том числе и null.
Пример 3. Использование класса LinkedList
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("F");
list.add("B");
list.add("D");
list.add("E");
list.add("C");
list.addLast("Z");
list.addFirst("A");
list.add(1, "A2");
System.out.println("Содержимое: " + list);
list.remove("F");
list.remove(2);
list.removeFirst();
list.removeLast();
System.out.println("Содержимое после удаления: " + list);
String val = list.get(2);
list.set(2, val + "+");
System.out.println("Содержимое после изменения: " + list);
}
}
5. Класс PriorityQueue
Конструкторы класса PriorityQueue:
- PriorityQueue() - создает очередь с приоритетами начальной емкостью 11, размещающую элементы согласно естественному порядку сортировки (Comparable);
- PriorityQueue(Collection<? extends E> c);
- PriorityQueue(int initialCapacity);
- PriorityQueue(int initialCapacity, Comparator<? super E> comparator);
- PriorityQueue(PriorityQueue<? extends E> c);
- PriorityQueue(SortedSet<? extends E> c).
Пример 4. Использование класса PriorityQueue
import java.util.Collections;
import java.util.PriorityQueue;
import java.util.Queue;
public class PriorityQueueExample {
public static void main(String[] args) {
Queue<String> queue1 = new PriorityQueue<>();
queue1.offer("Киев");
queue1.offer("Харьков");
queue1.offer("Львов");
queue1.offer("Кременчуг");
queue1.offer("Кременчуг");
System.out.print("Priority queue с Comparable: ");
while (queue1.size() > 0) {
System.out.print(queue1.remove() + " ");
}
System.out.println();
PriorityQueue<String> queue2
= new PriorityQueue<>(5, Collections.reverseOrder());
queue2.offer("Киев");
queue2.offer("Харьков");
queue2.offer("Львов");
queue2.offer("Кременчуг");
queue2.offer("Кременчуг");
System.out.print("Priority queue с Comparator: ");
while (queue2.size() > 0) {
System.out.print(queue2.remove() + " ");
}
}
}
Please log in or register to have a possibility to add comment.