web-dev-qa-db-ja.com

Javaコレクション(LIFO構造)

Java for LIFO Structure(Stack)for for success。のコレクションフレームワークを探しています。基本的に本当にシンプルなスタックが欲しいです。私の完璧なオプションはDequeになるが、私はJava 1.5。

私の構造に別のクラスを追加する必要はありませんが、それが可能かどうか疑問に思っています:

  1. コレクションフレームワーク(1.5)に仕事をするクラスはありますか?

  2. そうでない場合、再実装せずにキューをLIFOキュー(別名スタック)に変える方法はありますか?

  3. そうでない場合、このタスクのためにどのインターフェイスまたはクラスを拡張する必要がありますか? Sunの人々がDequeで作った方法を維持することは良いスタートだと思います。

どうもありがとう。

編集:私はStackクラスについて言うのを忘れました:Vectorクラスを実装し、Vectorクラスが少し時代遅れであるのを見たとき、私はこのクラスについて疑問を持っていますよね?

38

実際にはStackクラスがあります: http://Java.Sun.com/j2se/1.5.0/docs/api/Java/util/Stack.html

それを使用したくない場合、LinkedListクラス( http://Java.Sun.com/j2se/1.5.0/docs/api/Java/util/LinkedList.html )はaddFirstおよびaddLastおよびremoveFirstおよびremoveLastメソッド。スタックまたはキュークラスとしての使用に最適です。

53
Eli Courtwright

スタッククラスはゆっくりです:メソッドは同期されます+ Stac kは同期を拡張しますVector

8
Spy_DER

私はここでパーティーに遅れていることに気付きますが、Java.util.Collections(Java 7)には、Deque引数を取り、(明らかに)LIFOキュービューを返す静的な 'asLifoQueue'がありますこれはどのバージョンが追加されたかわかりません。

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

8
JVMATL

APIのスタッククラス があります。これはあなたのニーズを満たしますか?

7
Greg

これは少し前に尋ねられましたが、 Deque (deck)インターフェースを提供するJDK6 +回答を提供するのが賢明かもしれません ArrayDeque データ構造と- LinkedList は、このインターフェースを実装するために更新されました。同時アクセス用の特別な形式も存在し、 ConcurrentLinkedDeque および LinkedBlockingDeque によって実装されます。

Dequeの素晴らしい点の1つは、LIFO(スタック)とFIFO(キュー)の両方のサポートを提供することです。キュー操作用であり、新規参入者のスタック操作用です。

私見JDKはStackインターフェイスとQueueインターフェイスを持っている必要があります。これらは ArrayDeque のようなもので実装できますが、その構造に必要なメソッドのサブセットのみを公開します。 、つまり、LIFOはpop()Push()およびpeek()を定義でき、その後のコンテキストで

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

Push(E) が意図されていたときに誰かが誤って add(E) を呼び出すのを止めるスタック操作のみが公開されます。

6
Brett Ryan

DequeLinkedList

完全を期すために、 Deque インターフェイスと LinkedList 実装を使用した例を提供します。

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

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

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

DequeLinkedList でバックアップすると、要素の挿入と削除が一定の時間(O (1))。

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