web-dev-qa-db-ja.com

Javaでスタックをコピーするにはどうすればよいですか?

スタックAがあり、スタックAと同じスタックBを作成したい。スタックBを単にAへのポインタにしたくない-同じ要素を含む新しいスタックBを実際に作成したいスタックAと同じ順序でスタックAとして。スタックAは、文字列のスタックです。

ありがとう!

19
Pankaj Udhas

Stackクラスのclone()メソッドを使用するだけです(Cloneableを実装しています)。

JUnitを使用した簡単なテストケースを次に示します。

_@Test   
public void test()
{
    Stack<Integer> intStack = new Stack<Integer>();
    for(int i = 0; i < 100; i++)        
    {
        intStack.Push(i);
    }

    Stack<Integer> copiedStack = (Stack<Integer>)intStack.clone();

    for(int i = 0; i < 100; i++)            
    {
        Assert.assertEquals(intStack.pop(), copiedStack.pop());
    }
}
_

編集:

tmsimont:これにより、「チェックされていない、または安全でない操作」の警告が表示されます。この問題を発生させずにこれを行う方法はありますか?

私は最初、警告は避けられないと答えましたが、実際には_<?>_(ワイルドカード)を使用して回避することができます-typing:

_@Test
public void test()
{
    Stack<Integer> intStack = new Stack<Integer>();
    for(int i = 0; i < 100; i++)
    {
        intStack.Push(i);
    }

    //No warning
    Stack<?> copiedStack = (Stack<?>)intStack.clone();

    for(int i = 0; i < 100; i++)
    {
        Integer value = (Integer)copiedStack.pop(); //Won't cause a warning, no matter to which type you cast (String, Float...), but will throw ClassCastException at runtime if the type is wrong
        Assert.assertEquals(intStack.pop(), value);
    }
}
_

基本的には、_?_(不明な型)からIntegerへのチェックされていないキャストをまだ行っていると思いますが、警告はありません。個人的には、_Stack<Integer>_に直接キャストし、@SuppressWarnings("unchecked")を使用して警告を抑制したいです。

26
esaj

StackVectorを拡張するため、新しいStackを新しく作成し、.addAll(...)を使用してアイテムをコピーできます。

Stack<Type> newStack = new Stack<Type>();
newStack.addAll(oldStack);
20
msandiford

Stack クラスは AbstractList のサブクラスです。

それをAbstractListのように扱い、get(int index)メソッドを使用して、0からリスト/スタックの長さまでスタック内の要素を反復処理し、要素を新しいスタックに追加します。

これは要素をコピーしません-要素を新しいスタックに追加します。要素もコピーする必要がある場合は、別のレベルに移動して要素のコピーを作成し、それらを新しいスタックに追加する必要があります。

cloneメソッドを使用して フル(または「ディープ」)コピー を実行できますが、オブジェクトは Clonable インターフェースを実装して、 get オブジェクトの深いコピー

4
jefflunt

clone メソッドを使用します。

0
Grammin
 /**
     * Copy constructor for the Stack class
     * @param original the Stack to copy
     * @postcondition a new Stack object which is
     * an identical, but distinct, copy of original
     */
    public Stack(Stack<T> original) {
        if (original.length == 0)
        {
            length = 0;
            top = null;
        } else
        {
            Node temp = original.top;
            while (temp != null)
            {
                Push(temp.data); // inserts into this
                temp = temp.next;
            }
            temp = top;
            temp = temp.next;
            top.next = null;
            while (temp != null){
                Push(temp.data); // inserts into this
                temp = temp.next;
            }

        }
    }
0
jerry li