betacode

Руководство Java Deque

  1. Deque
  2. Deque Методы
  3. Examples

1. Deque

Deque - это аббревиатура от"Double Ended Queue" (двойная очередь). Как люди, выстраивающиеся в очередь в супермаркете, обслуживаются только первый и последний человек в очереди. Deque предлагает немного больше гибкости, чем обычная очередь.
public interface Deque<E> extends Queue<E>
Deque - это подинтерфейс of Queue, предоставляющий методы для вставки элемента в начало или конец, а также методы для доступа или удаления его первого или последнего элемента.
Deque также включает в себя методы, которые позволяют ему действовать как stack (стек) (см. Более подробное объяснение в статье).

2. Deque Методы

Methods of Deque
void addFirst(E e);
void addLast(E e);
boolean offerFirst(E e);
boolean offerLast(E e);

E removeFirst();
E removeLast();
E pollFirst();
E pollLast();

E getFirst();
E getLast();
E peekFirst();
E peekLast();

void push(E e);
E pop();

boolean removeFirstOccurrence(Object o);
boolean removeLastOccurrence(Object o);

Iterator<E> descendingIterator();

// Methods inherited from Queue:

boolean add(E e);
boolean offer(E e);

E remove();
E poll();

E element();
E peek();

// Methods inherited from Collection:

boolean addAll(Collection<? extends E> c);  
boolean remove(Object o);
boolean contains(Object o);

int size();
Iterator<E> iterator();
...
Список 12 характерных методов of Deque:
Insert
addFirst(E)
offerFirst(E)
addLast(E)
offerLast(E)
Remove
removeFirst()
pollFirst()
removeLast()
pollLast()
Examine
getFirst()
peekFirst()
getLast()
peekLast()
boolean addFirst(E) / boolean offerFirst(E)
boolean addFirst(E)
Вставляет элемент перед Deque. Этот метод вызовет исключение, если емкость Deque заполнена. Метод возвращает true, если вставка прошла успешно.
boolean offerFirst(E)
Вставляет элемент перед Deque. Если емкость Deque заполнена или вставка не удалась, метод вернет false, в противном случае true.
Примечание: В зависимости от типа Deque он может ограничивать (или не ограничивать) количество элементов.
boolean addLast(E) / boolean offerLast(E)
boolean addLast(E)
Вставляет элемент в конце Deque. Этот метод создает исключение, если емкость Deque заполнена. Метод возвращает true, если вставка прошла успешно.
boolean offerLast(E)
Вставляет элемент в конце Deque. Если емкость Deque заполнена или вставка не удалась, метод вернет false, в противном случае true.
E removeFirst() / E pollFirst()
E removeFirst()
Возвращает первый элемент Deque и удаляет его из Deque. Этот метод создает исключение, если Deque не имеет элементов.
E pollFirst()
Возвращает первый элемент Deque и удаляет его из Deque. Этот метод вернет null, если Deque не имеет элементов.
E removeLast() / E pollLast()
E removeLast()
Возвращает последний элемент Deque и удаляет его из Deque. Этот метод создает исключение, если Deque не имеет элементов.
E pollLast()
Возвращает последний элемент Deque и удаляет его из Deque. Этот метод вернет null, если Deque не имеет элементов.
E getFirst() / E peekFirst()
E getFirst()
Возвращает первый элемент Deque, но не удаляет его из Deque. Этот метод создает исключение, если Deque не имеет элементов.
E peekFirst()
Возвращает первый элемент Deque, но не удаляет его из Deque. Этот метод возвращает null, если Deque не имеет элементов.
E getLast() / E peekLast()
E getLast()
Возвращает последний элемент Deque, но не удаляет его из Deque. Этот метод создает исключение, если Deque не имеет элементов.
E peekLast()
Возвращает последний элемент Deque, но не удаляет его из Deque. Этот метод возвращает null, если Deque не имеет элементов.
Methods inherited from Queue:
Унаследованные методы из Queue и соответствующие методы в Deque:
booleanadd(E)
booleanaddLast(E)
(*)
booleanoffer(E)
booleanofferLast(E)
(*)
E remove()
E removeFirst()
E poll()
E pollFirst()
E element()
E getFirst()
E peek()
E peekFirst()
(*) - В большинстве типов Queue, 2 метода add(E) и offer(E) вставляют элемент в конец. Но это не верно для PriorityQueue, поскольку PriorityQueue определяет положение вставленного элемента на основе его приоритета
Stack?
Deque может действовать как stack (стек), поскольку он предоставляет методы для работы в рамках механизма LIFO (Last In First Out) (последний добавленный элемент будет извлечен первым).
boolean push(e)
boolean addFirst(e)
E pop()
E removeFirst()
E peek()
E getFirst()

3. Examples

Deque - это интерфейс, поэтому для создания объекта Deque необходимо использовать один из его подклассов, таких как ArrayDeque, ConcurrentLinkedDeque, LinkedList, LinkedBlockingDeque.
Deque<String> deque = new ArrayDeque<>();

Deque<String> deque = new LinkedList<>();
Класс Customer будет участвовать в примерах.
Customer.java
package com.o7planning.deque.ex;

public class Customer {
    private Integer cusId;
    private String cusName;
    
    public Customer(Integer cusId, String cusName) {
        super();
        this.cusId = cusId;
        this.cusName = cusName;
    }
    public Integer getCusId() {
        return cusId;
    }
    public String getCusName() {
        return cusName;
    }
}
DequeEx1.java
package com.o7planning.deque.ex;

import java.util.ArrayDeque;
import java.util.Deque;

public class DequeEx1 {

    public static void main(String[] args) {
        
        // Create a Deque with maximum capacity of 10 elements.
        Deque<Customer> deque = new ArrayDeque<Customer>(10);
        
        deque.addFirst(new Customer(1, "Tom"));
        deque.addFirst(new Customer(2, "Jerry"));
        deque.addLast(new Customer(3, "Donald"));
        
        Customer current = null;
        
        // Retrieve first element and remove it from Deque.
        while((current = deque.pollFirst())!= null) {
            System.out.println("Serving customer: " + current.getCusName());
        }
    }
}
Output:
Serving customer: Jerry
Serving customer: Tom
Serving customer: Donald
Deque можно использовать как stack (стек). См. пример моделирования карт (cards):
DequeStackEx1.java
package com.o7planning.deque.ex;

import java.util.Deque;
import java.util.LinkedList;

public class DequeStackEx1 {

    public static void main(String[] args) {
        // Create a Deque to use as a Stack.
        Deque<String> stackOfCards = new LinkedList<>();

        // Pushing new items to the Stack
        stackOfCards.push("Jack");
        stackOfCards.push("Queen");
        stackOfCards.push("King");
        stackOfCards.push("Ace");

        System.out.println("Stack => " + stackOfCards);
        System.out.println();
 
        // Popping items from the Stack
        String cardAtTop = stackOfCards.pop();  // Throws NoSuchElementException if the stack is empty
        System.out.println("Stack.pop() => " + cardAtTop);
        System.out.println("Current Stack => " + stackOfCards);
        System.out.println();

        // Get the item at the top of the stack without removing it
        cardAtTop = stackOfCards.peek();
        System.out.println("Stack.peek() => " + cardAtTop);
        System.out.println("Current Stack => " + stackOfCards);
    }
}
Output:
Stack => [Ace, King, Queen, Jack]

Stack.pop() => Ace
Current Stack => [King, Queen, Jack]

Stack.peek() => King
Current Stack => [King, Queen, Jack]