Comment copier une pile en Java?
j'ai une pile A et je veux créer une pile B qui est identique à la pile A. Je ne veux pas que la pile B soit simplement un pointeur vers A -- je veux en fait créer une nouvelle pile B qui contient les mêmes éléments que la pile A dans le même ordre que la pile a. La pile a est une pile de chaînes.
Merci!
4 réponses
il suffit d'utiliser la méthode clone () de la classe Stack (elle implémente Cloneable).
voici un test simple avec 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());
}
}
Edit:
tmsimont: cela crée pour moi un avertissement" opérations non contrôlées ou dangereuses". Tout façon de le faire sans générer ce problème?
j'ai d'abord répondu que l'avertissement serait inévitable, mais en fait c'est évitables à l'aide de <?>
(générique) -en tapant:
@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);
}
}
en gros, je dirais que vous faites toujours un casting non vérifié de ?
(type inconnu)Integer
, mais il n'y a pas d'avertissement. Personnellement, je préférerais quand même lancer directement dans Stack<Integer>
et supprimer l'avertissement @SuppressWarnings("unchecked")
.
Stack
extends Vector
, donc vous pouvez juste new up un nouveau Stack
et utiliser .addAll(...)
pour copier les éléments:
Stack<Type> newStack = new Stack<Type>();
newStack.addAll(oldStack);
Stack classe est une sous-classe de AbstractList.
il suffit de le traiter comme un AbstractList, itérer à travers les éléments de la pile en utilisant le get(int index)
méthode, de 0 à la longueur de votre liste/pile, et d'ajouter les éléments de la nouvelle pile.
ceci ne copiera pas les éléments - il ajoutera les éléments à la nouvelle pile. Si vous avez besoin de copier les éléments aussi bien, vous aurez besoin d'aller à un autre niveau profond et de créer des copies des éléments, et ajoutez - les à la nouvelle pile.
Vous pouvez faire complet (ou "profonde") copies, en utilisant le clone
méthode, mais notez que l'objet doit implémenter l' Clonable interface afin d'obtenir copies profondes d'objets.