2008-11-19 27 views
28

Ich suche im Collections Framework von Java nach einer LIFO Struktur (Stack) ohne Erfolg. Grundsätzlich möchte ich einen wirklich einfachen Stack; Meine perfekte Option wäre eine Deque, aber ich bin in Java 1.5.Java Collections (LIFO Structure)

Ich möchte nicht eine andere Klasse zu meiner Struktur zu haben, hinzufügen, aber ich frage mich, ob das möglich ist:

  1. Gibt es eine Klasse im Collections Framework (1.5), die die Arbeit erledigt?

  2. Wenn nicht, gibt es eine Möglichkeit, eine Warteschlange in einer LIFO-Warteschlange (aka Stack) ohne erneute Implementierung zu drehen?

  3. Wenn nicht, welche Schnittstelle oder Klasse sollte ich für diese Aufgabe erweitern? Ich denke, dass die Art, wie die Jungs von Sun mit der Deque gemacht haben, ein guter Anfang ist.

Vielen Dank.

EDIT: Ich habe vergessen, über die Stack-Klasse zu sagen: Ich habe meine Zweifel über diese Klasse, als ich sah, dass es die Vector-Klasse implementiert, und die Vector-Klasse ist ein wenig veraltet, nicht wahr?

+2

Das Hauptproblem mit Vector ist, dass alle Zugriffe synchronisiert sind, ob Sie es benötigen oder nicht. Es ist so "up-to-date" wie jede der anderen Sammlungen, hat aber aufgrund des Synchronisationsproblems einen schlechten Ruf. –

Antwort

46

Es gibt tatsächlich eine Stack-Klasse: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Stack.html

Wenn Sie wollen, dass nicht verwenden, die LinkedList Klasse (http://java.sun.com/j2se/1.5.0/docs/api/java/util/LinkedList.html) hat addFirst und addLast und removeFirst und removeLast Methoden, es perfekt als Stapel für die Verwendung zu machen oder Warteschlangenklasse

+4

LinkedList bietet dann auch die Definition einer Deque, die Ihre gewünschte Sammlung ist. –

+1

Ja, ich denke, dass LinkedList das ist, nach dem ich gesucht habe, denn bei meinem ersten Blick habe ich nicht über die Methoden Addfirst und removeFirst nachgedacht. Danke vielmals. –

+0

nur Problem ist, dass Deque auf API Level 9 implementiert wurde .... – Necronet

6

Es gibt eine Stack class in the API. Wird dies Ihren Bedürfnissen entsprechen?

+0

Sorry, ich habe vergessen, über die Stack-Klasse zu sagen und meine Meinung dazu, aber ich denke, dass das wahrscheinlich eine bessere Lösung ist, als meine eigene Klasse zu implementieren. ist es nicht? –

+5

Verwenden Sie nicht die Stack-Klasse. Es erweitert Vector, der nur für die Abwärtskompatibilität beibehalten wird. – erickson

8

Stapel Klasse ist langsam: Methoden synchronisiert + Stac k Vektor

5

Während dies vor einiger Zeit gefragt wurde, könnte es klug sein, eine JDK6 + Antwort zu geben, die jetzt eine Deque (Deck) Schnittstelle zur Verfügung, die durch die ArrayDeque Datenstruktur implementiert ist und die LinkedList wurde aktualisiert, um dies zu implementieren Schnittstelle. Spezielle Formulare für den gleichzeitigen Zugriff sind ebenfalls vorhanden und werden von ConcurrentLinkedDeque und LinkedBlockingDeque implementiert.

Das Tolle an einer Deque ist, dass sie sowohl LIFO (Stack) als auch FIFO (Queue) unterstützt, was zu Verwirrung darüber führen kann, welche Methoden für Queue-Operationen und welche für Stack-Operationen für Newcomer gedacht sind.

IMHO sollte das JDK hat eine Stack-Schnittstelle und eine Queue Schnittstelle, die nach wie vor von Künstlern wie ArrayDeque umgesetzt werden könnten, sondern nur die Teilmenge von Methoden für die Struktur erforderlich aussetzen, das heißtein LIFO konnte pop(), push() und peek(), dann im Zusammenhang mit

LIFO<String> stack = new ArrayDeque<>(); 

nur stapeln Operationen ausgesetzt definieren, welche jemand aufhört add(E) versehentlich aufrufen, wenn push(E) bestimmt war.

-1

Nur der Vollständigkeit halber gebe ich eine Dequeue und ein reines LinkedList-Beispiel.

Mit der Dequeue Schnittstelle in Kombination mit einem LinkedList (empfohlen):

Deque<String> dequeue = new LinkedList<>(); 
    dequeue.add("first"); 
    dequeue.add("last"); 

    // returns "last" without removing it 
    System.out.println(dequeue.peekLast()); 

    // removes and returns "last" 
    System.out.println(dequeue.pollLast()); 

eine Dequeue von einem LinkedList Sichern ist für Leistung, da das Einfügen und Entfernen von Elementen aus es in konstanter Zeit durchgeführt wird (O (1)).

Mit einem LinkedList allein:

LinkedList<String> list = new LinkedList<>(); 
    list.add("first"); 
    list.add("last"); 

    // returns "last" without removing it 
    System.out.println(list.getLast()); 

    // removes and returns "last" 
    System.out.println(list.removeLast()); 
+0

Der ursprüngliche Beitrag verwendete eine Warteschlange, die offensichtlich FIFO und nicht LIFO war, also habe ich meine Antwort aktualisiert. – Ivo

-1

einfachste Antwort ein ArrayList zu verwenden wäre, und nur Objekte hinzufügen in dem 0-Index.

List<String> arrayList = new ArrayList<>(); 
arrayList.add(0, "three"); 
arrayList.add(0, "two"); 
arrayList.add(0, "one"); 

// Prints: [one, two, three] 
System.out.println(arrayList); 

Hinzufügen von Objekten bei 0 Index wird an den Anfang der Liste hinzugefügt und verschiebt den Rest der Liste. Jetzt haben Sie eine einfach funktionierende LIFO-Datenstruktur.

BEARBEITEN: Verwenden einer LinkedList ist schneller als mit einer ArrayList. So ist die Verwendung von LinkedList.addFirst() besser.

+1

Dies ist keine gute Idee, die Leistung, wegen der Verschiebung. Eine LinkedList würde hier viel besser funktionieren. – Ivo