2011-10-27 16 views
14

私はスタックAを持っており、スタックAと同じスタックBを作成したいと思います。スタックBを単にAへのポインタにしたくありません。実際には、スタックAと同じ要素をスタックAと同じ順序で使用します。スタックAは文字列のスタックです。Javaでスタックをコピーするにはどうすればよいですか?

ありがとうございます!

+1

'スタック B =(スタック)a.clone();' – Marcelo

答えて

19

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")という警告を表示しないことをお勧めします。新しいStackを単に新しいことができますし、アイテムをコピーする.addAll(...)を使用して

+0

これは本当に有益な、ありがとう! –

+0

これは、私に「未チェックまたは安全でない操作」の警告を生成します。この問題を発生させることなくこれを行う方法はありますか? – tmsimont

+1

@tmsimont:私の前のコメントを無視し、編集された答えを見ると、 '@SuppressWarnings(" unchecked ")'を使わずに警告を防ぐことができます。 – esaj

4

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

単純にAbstractListのように扱い、get(int index)メソッドを使用して0からリスト/スタックの長さまで繰り返し、要素を新しいスタックに追加します。

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

あなたはclone方法を使用することにより、full (or "deep") copiesを行いますが、オブジェクトはdeep copies of objectsを得るためにClonableインタフェースを実装する必要があることに注意することができます。

18

Stackは、Vectorを拡張:

Stack<Type> newStack = new Stack<Type>(); 
newStack.addAll(oldStack); 
+0

うわーはそれを考えなかった、ありがとう! –

+3

これでメンバーアイテムはコピーされません。どちらのスタックも同じ文字列を指します。 –

+2

文字列は不変なので、文字列のコピーを作成しても問題はありません。 – msandiford

関連する問題