0

ArrayListとStackの2つのコレクションがあります。このコードのビットにいくつかの単純なポップ/プッシュ機能が必要だったので、スタックを使用します。ArrayListは、関数内のコードの小さなセクションであるため、基本的にout変数です。

したがって、変数はそのように定義され、コードが実行されてスタックに要素が追加されます。

ArrayList<String> out = new ArrayList<String>();

/* other code.. */

Stack<String> lineStack = new Stack<String>();

/* code that adds stuff to the stack */

問題は、スタックが完全に実装されたので、ポップの順序とは逆の順序でoutArrayListに配置するにはどうすればよいかということです。

私が最初に考えた解決策は

 while(!lineStack.empty()) {
     out.add(0, lineStack.pop());
 }

...これは機能しますが、ArrayListの先頭に要素を追加する効率について心配しています(これにより、既存のすべての要素をシフトする必要があります..リンクリストです(私は信じています)..大したことですが、それでも懸念)。また、私はこれをループで実行しています...おそらく不必要に。

したがって、ループを含まない2番目のソリューション(少なくとも私のコードでは、バックエンド呼び出しがループを実行していると確信しています)。

 List l = lineStack.subList(0, lineStack.size());
 out.addAll(l);

リストを割り当てる必要がないことはわかっていますが、コードをよりクリーンにするために保持されます。ただし、これによってパフォーマンスが特に向上するかどうかはわかりません。

だから、私の質問は:これらのどれが小から中サイズのセットに最も効率的である可能性がありますか?より効率的な解決策があるとしたら、それは何でしょうか?

4

5 に答える 5

23

Iterable<T>実装順序はStack<T>とにかくあなたが望む順序になるので、あなたはただ使うことができます

new ArrayList<String>(stack);

短いですが完全な例を次に示します。

import java.util.*;

public class Test
{
    public static void main(String[] args)
    {
        Stack<String> stack = new Stack<String>();
        stack.push("Bottom");
        stack.push("Middle");
        stack.push("Top");

        List<String> list = new ArrayList<String>(stack);

        for (String x : list)
        {
            System.out.println(x);
        }
    }
}

これは印刷されます:

Bottom
Middle
Top

(これは、ポップした場合に得られる順序とは逆の順序です)。

ArrayList<String>編集:もう1つの質問-とにかく本当にそれが必要ですか?Stack<T>実装List<T>; どのような特別な機能がArrayList必要ですか?(私はあなたがそれらを必要としないと言っているではなく、ただチェックするだけです!)

于 2009-08-07T14:38:24.707 に答える
3

スタックはコレクションのサブクラスであり、コレクションには逆メソッドがあるため、次のことができます-

   Stack originalStack = ...
   Collections.reverse(originalStack);
于 2016-03-03T13:02:14.567 に答える
2

配列としては必要ないが、別のスタックが機能する場合は、次のようにします。

Stack<String> reversedStack = new Stack<String>(); while (!oldStack.empty()) { reversedStack.push(oldStack.pop()); }

すばやく、シンプルで、何をしているのかを簡単に確認できます。

于 2014-04-23T17:51:23.413 に答える
1

ArrayListをサブクラス化し、popおよびpushメソッドを追加します。これをStackクラスとして使用します。

準備ができたら、それをArraylist変数に割り当てれば、準備が整います。

于 2009-08-07T14:38:04.177 に答える
0

Stack.toArrayを利用するのは簡単です。

@Test
public void stackToList() {
    Stack<String> stack = new Stack<String>();
    stack.push("aaa");
    stack.push("bbb");
    stack.push("ccc");
    List<String> list=  Arrays.asList(stack.toArray(new String[0]));
    Assert.assertEquals(Arrays.asList("aaa", "bbb", "ccc"), list);
}
于 2009-08-07T14:42:35.340 に答える