web-dev-qa-db-fra.com

Collections Java (structure LIFO)

Je recherche dans la structure de collections de Java une structure LIFO (pile) sans succès. En gros, je veux une pile très simple. mon option idéale serait un Deque, mais je suis en Java 1.5.

J'aimerais ne pas avoir à ajouter une autre classe à ma structure mais je me demande si c'est possible:

  1. Existe-t-il une classe dans le cadre Collections (1.5) qui fait le travail?

  2. Sinon, y a-t-il un moyen de transformer une file d'attente dans une file d'attente LIFO (autrement dit une pile) sans réimplémentation?

  3. Sinon, quelle interface ou classe dois-je étendre pour cette tâche? Je suppose que garder le chemin que les gars de Sun ont fait avec la Deque est un bon début.

Merci beaucoup.

EDIT: J'ai oublié de dire à propos de la classe Stack: J'ai des doutes sur cette classe lorsque j'ai vu qu'elle implémentait la classe Vector et que celle-ci est un peu obsolète, n'est-ce pas?

33
David Santamaria

Il y a en fait une classe Stack: http://Java.Sun.com/j2se/1.5.0/docs/api/Java/util/Stack.html

Si vous ne voulez pas l'utiliser, la classe LinkedList ( http://Java.Sun.com/j2se/1.5.0/docs/api/Java/util/LinkedList.html ) a addFirst et addLast et les méthodes removeFirst et removeLast, ce qui le rend parfait pour une utilisation en tant que classe de pile ou de file d'attente.

50
Eli Courtwright

Stack La classe est lente: les méthodes sont synchronisées + Stac k étend synchronisé Vector

8
Spy_DER

Je me rends compte que je suis en retard pour la fête ici, mais Java.util.Collections (Java 7) a un 'asLifoQueue' statique qui prend un argument de Deque et renvoie (évidemment) une vue de la file d'attente LIFO du deque. Je ne sais pas quelle version cela a été ajouté.

http://docs.Oracle.com/javase/7/docs/api/Java/util/Collections.html#asLifoQueue(Java.util.Deque)

8
JVMATL

Il y a une classe Stack dans l'API . Cela répondra-t-il à vos besoins?

6
Greg

Bien que cela ait été demandé il y a quelque temps, il pourrait être judicieux de fournir une réponse JDK6 + qui fournit désormais une interface Deque (deck) implémentée par la structure ArrayDeque data et le LinkedList a été mis à jour. pour implémenter cette interface. Des formulaires spécialisés pour l'accès simultané existent également et sont implémentés par ConcurrentLinkedDeque et LinkedBlockingDeque .

La particularité d’un déque est qu’il fournit à la fois la prise en charge LIFO (pile) et FIFO (file d’attente). Cela peut entraîner une confusion quant aux méthodes utilisées pour les opérations de file d’attente et celles utilisées pour les opérations de pile. pour les nouveaux arrivants.

IMHO, le JDK devrait avoir une interface Stack et une interface Queue qui pourraient toujours être implémentées par le type de ArrayDeque mais n'exposent que le sous-ensemble de méthodes requises pour cette structure, c'est-à-dire qu'un LIFO pourrait définir pop(), Push(). et peek(), puis dans le contexte de

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

seules les opérations de pile sont exposées, ce qui empêche quelqu'un d'appeler accidentellement add (E) lorsque Push (E) était prévu.

6
Brett Ryan

Juste pour des raisons d'exhaustivité, je fournis un exemple Dequeue et un pur LinkedList.

Utilisation de l'interface Dequeue en combinaison avec une liste liée (recommandé):

    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());

La sauvegarde d'une Dequeue par une LinkedList est excellente pour la performance, car son insertion et son retrait se font en temps constant (O (1)).

En utilisant une seule LinkedList:

    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
Ivo