私はスタックAを持っており、スタックAと同じスタックBを作成したいと思います。スタックBを単にAへのポインタにしたくありません。実際には、スタックAと同じ要素をスタックAと同じ順序で使用します。スタックAは文字列のスタックです。Javaでスタックをコピーするにはどうすればよいですか?
ありがとうございます!
私はスタックAを持っており、スタックAと同じスタックBを作成したいと思います。スタックBを単にAへのポインタにしたくありません。実際には、スタックAと同じ要素をスタックAと同じ順序で使用します。スタックAは文字列のスタックです。Javaでスタックをコピーするにはどうすればよいですか?
ありがとうございます!
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(...)
を使用して
cloneメソッドを使用します。
StackクラスはサブクラスAbstractListです。
単純にAbstractListのように扱い、get(int index)
メソッドを使用して0からリスト/スタックの長さまで繰り返し、要素を新しいスタックに追加します。
これは要素をコピーしません。要素を新しいスタックに追加します。要素をコピーする必要がある場合は、さらに別のレベルに移動して要素のコピーを作成し、それらを新しいスタックに追加する必要があります。
あなたはclone
方法を使用することにより、full (or "deep") copiesを行いますが、オブジェクトはdeep copies of objectsを得るためにClonableインタフェースを実装する必要があることに注意することができます。
Stack
は、Vector
を拡張:
Stack<Type> newStack = new Stack<Type>();
newStack.addAll(oldStack);
うわーはそれを考えなかった、ありがとう! –
これでメンバーアイテムはコピーされません。どちらのスタックも同じ文字列を指します。 –
文字列は不変なので、文字列のコピーを作成しても問題はありません。 – msandiford
'スタック B =(スタック)a.clone();' –
Marcelo