codestory

Die Anleitung zu Java Deque

  1. Deque
  2. Die Methode von Deque
  3. Examples

1. Deque

Deque ist ein Abkürzung für "Double Ended Queue". Wie die Leute, die sich im Supermarket anstellen,werden nur die erste und letzte Person in der Warteschlange bedient. Deque bietet etwas mehr Flexibitlität als eine normale Warteschlange.
public interface Deque<E> extends Queue<E>
Deque ist die untergeordnete Interface von Queue, es bietet die Methoden zum Einfügen eines Element am Anfang oder Ende sowie Methoden zum Zugreifen auf oder Entfernen des ersten oder letzten Elements.
Deque enthält auch die Methoden, mit denen es als stack (Stapel) funktionieren kann (weitere Erläuterungen finden Sie im Artikel).

2. Die Methode von 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();
...
Die Liste von 12 spezifische Methoden von 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)
Fügt ein Element vor Deque ein. Diese Methode löst eine Ausnahme aus, wenn die Kapazität von Deque voll ist. Die Methode gibt true zurück, wenn das Einfügen erfolgreich ist.
boolean offerFirst(E)
Fügt ein Element vor Deque. Wenn die Kapazität von Deque voll ist oder das Einfügen nicht erfolgreich ist, gibt die Methode false zurück, umgekehrt gibt sie true zurück.
Hinweis: Abhängig von dem Typ von Deque kann es die Anzahl von Elemente beschränkt oder nicht beschänkt.
boolean addLast(E) / boolean offerLast(E)
boolean addLast(E)
Fügt ein Element am Ende von Deque ein. Diese Methode löst eine Ausnahme aus wenn die Kapazität von Deque voll ist. Die Methode gibt true zurück wenn das Einfügen erfolgreich ist.
boolean offerLast(E)
Fügt ein Element am Ende von Deque ein. Wenn die Kapazität von Deque voll ist oder das Einfügen nicht erfolgreich ist, gibt die Methode false zurück, umgekehrt gibt sie true zurück.
E removeFirst() / E pollFirst()
E removeFirst()
Gibt das erste Element der Deque zurück und entfernt es gleichzeitig aus der Deque. Diese Methode löst eine Ausnahme aus, wenn Deque keine Elemente enthält.
E pollFirst()
GIbt das erste Element der Deque zurück und entfernt es gleichzeitig aus der Deque. Diese Methode gibt null zurück wenn Deque keine Elemente enthält.
E removeLast() / E pollLast()
E removeLast()
Gibt das letzte Element der Deque zurück und entfernt es gleichzeitig aus der Deque. Diese Methode löst eine Ausnahme aus, wenn Deque keine Elemente enthält.
E pollLast()
GIbt das letzte Element der Deque zurück und entfernt es gleichzeitig aus der Deque. Diese Methode gibt null zurück wenn Deque keine Elemente enthält.
E getFirst() / E peekFirst()
E getFirst()
Gibt das erste Element der Deque zurück und entfernt es jedoch aus der Deque nicht. Diese Methode löst eine Ausnahme aus, wenn Deque keine Elemente enthält.
E peekFirst()
Gibt das erste Element der Deque zurück und entfernt es jedoch aus der Deque nicht. Diese Methode gibt null zurück wenn Deque keine Elemente enthält.
E getLast() / E peekLast()
E getLast()
Gibt das letzte Element der Deque zurück und entfernt es jedoch aus der Deque nicht. Diese Methode löst eine Ausnahme aus, wenn Deque keine Elemente enthält.
E peekLast()
Gibt das letzte Element der Deque zurück und entfernt es jedoch aus der Deque nicht. Diese Methode gibt null zurück wenn Deque keine Elemente enthält.
Methods inherited from Queue:
Die Methoden erben von der Queue und den entsprechenden Methoden in 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()
(*) - In den meisten Typen von Queue fügen die Methoden add(E) und offer(E) das Element am Ende ein. Dies gilt jedoch nicht für PriorityQueue, denn PriorityQueue bestimmt die Position des eingefügten Elements basierend auf seiner Priorität.
Stack?
Deque kann als ein stack funktionieren, da es die Methoden für die Operation mit dem Mechanismus LIFO (Last In First Out) anbietet (das zuletzt hinzugefügte Element wird zuerst abgerufen)
boolean push(e)
boolean addFirst(e)
E pop()
E removeFirst()
E peek()
E getFirst()

3. Examples

Deque ist eine Interface. Deshalb müssen Sie eine seiner Unterklassen benutzen um das Objekt Deque zu erstellen, z.B ArrayDeque, ConcurrentLinkedDeque, LinkedList, LinkedBlockingDeque.
Deque<String> deque = new ArrayDeque<>();

Deque<String> deque = new LinkedList<>();
Die Klasse Customer nehmen an die Beispiele teil:
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 kann wie ein stack funktionieren, schauen Sie ein Beispiel zur Simulation der Karten (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]