2011-10-27 12 views
14

A yığını var ve ben A yığını ile aynı olan bir B yığını oluşturmak istiyorum. Ben B yığını sadece A için bir işaretçi istemiyorum - aslında içeren yeni bir B yığını oluşturmak istiyorum. A yığınıyla aynı öğe, A yığınıyla aynı sırada. Yığın A, dizelerin bir yığınıdır.Java'da bir yığını nasıl kopyalarım?

Teşekkürler!

+1

'Stack b = (Stack ) a.clone();' – Marcelo

cevap

19

Sadece yığın sınıfının() - yığın sınıfının (cloneable uygular) bir kopyasını kullanın.

Burada JUnit ile basit bir test-durum:

@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()); 
    } 
} 

Düzenleme:

tmsimont: Bu benim için bir "kontrolsüz ya da güvenli olmayan işlemler" uyarısı oluşturur. Herhangi bir Bu sorunu oluşturmadan bunu yapmak için bir yol?

Ben ilk -typing uyarı kaçınılmaz olurdu, ama aslında o <?> (joker) kullanılarak önlenebilir olduğuna cevap

: Temelde

@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); 
    } 
} 

Hala denetlenmeyen döküm yapıyoruz derdim ?'dan (bilinmiyor tipi) Integer'a kadar, ancak uyarı yok. Şahsen ben hala Stack<Integer>'a dökülmeyi ve @SuppressWarnings("unchecked") ile uyarıyı bastırmayı tercih ediyorum.

+0

şudur Gerçekten yararlı, teşekkürler! –

+0

Bu, benim için "denetlenmeyen veya güvenli olmayan işlemler" uyarısı oluşturur. Bu sorunu üretmeden bunu yapmanın herhangi bir yolu var mı? – tmsimont

+1

@tmsimont: Önceki yorumumu dikkate al ve düzenlenen cevabı gör, '@SuppressWarnings (" işaretlenmemiş ")' özelliğini kullanmadan uyarıyı engellemek mümkündür. – esaj

4

Stack sınıfı, AbstractList sınıfının bir alt sınıfıdır.

Basitçe bir Soyut Listesi gibi davranın, get(int index) yöntemini kullanarak yığındaki öğeler arasında yineleyin, 0'dan listenin/yığınının uzunluğuna kadar ve öğeleri yeni yığına ekleyin.

Bu, öğeleri kopyalamayacak - öğeleri yeni yığına ekleyecektir. Öğeleri de kopyalamanız gerekiyorsa, başka bir düzeye gitmeli ve öğelerin kopyalarını oluşturmalı ve bunları yeni yığına eklemelisiniz.

Sen clone yöntemini kullanarak, full (or "deep") copies, ama nesne deep copies of objects almak için Clonable arabirimini uygulamak gerektiğine dikkat edebilirsiniz.

18

StackVector uzanır, bu yüzden olabildiğince yeni Stack ve öğeleri kopyalamak için .addAll(...) kullanmak kadar sadece yeni:

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

wow bunu düşünmemişti, teşekkürler! –

+3

Bu, üye öğeleri kopyalamaz. Her iki yığın da aynı Dizgileri gösterecektir. –

+2

Dizeler değişmezdir, bu nedenle bir dizenin kopyasının oluşturulması herhangi bir yardımcı olmaz. – msandiford