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!

17
demandé sur Pankaj Udhas 2011-10-27 21:23:27

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").

21
répondu esaj 2015-03-16 14:23:38

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);
20
répondu msandiford 2011-10-27 17:28:57

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.

4
répondu jefflunt 2011-10-27 17:28:06

vous voulez utiliser le clone méthode.

0
répondu Grammin 2011-10-27 17:27:19