2011-10-27 11 views
14

मेरे पास एक स्टैक ए है और मैं एक स्टैक बी बनाना चाहता हूं जो कि स्टैक ए के समान है। मैं नहीं चाहता कि स्टैक बी को केवल एक पॉइंटर बनें - मैं वास्तव में एक नया स्टैक बी बनाना चाहता हूं जिसमें शामिल है स्टैक ए के रूप में वही तत्व स्टैक ए के समान क्रम में ए स्टैक ए तारों का ढेर है।मैं जावा में एक स्टैक कैसे कॉपी करूं?

धन्यवाद!

+1

'ढेर ख = (ढेर ) a.clone();' – Marcelo

उत्तर

19

बस स्टैक-क्लास (यह क्लोनबल लागू करता है) के क्लोन() -method का उपयोग करें।

यहाँ 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") के साथ चेतावनी दबा दूंगा।

+0

यह है वास्तव में सहायक, धन्यवाद! –

+0

यह मेरे लिए एक "अनचेक या असुरक्षित संचालन" चेतावनी बनाता है। इस समस्या को उत्पन्न किए बिना ऐसा करने का कोई तरीका? – tmsimont

+1

@tmsimont: मेरी पिछली टिप्पणी को नजरअंदाज करें और संपादित उत्तर देखें, '@SuppressWarnings (" अनचेक ") का उपयोग किये बिना चेतावनी को रोकना संभव है। – esaj

0

आप clone विधि का उपयोग करना चाहते हैं।

4

Stack कक्षा AbstractList का उप-वर्ग है।

बस इसे एक सारसूची की तरह व्यवहार करें, get(int index) विधि का उपयोग करके स्टैक में तत्वों के माध्यम से 0 से अपनी सूची/ढेर की लंबाई तक, और नए स्टैक में तत्व जोड़ें।

यह तत्वों की प्रतिलिपि नहीं करेगा - यह तत्वों को नए ढेर में जोड़ देगा। यदि आपको तत्वों की प्रतिलिपि बनाने की आवश्यकता है, तो आपको एक और स्तर गहराई से जाना होगा और तत्वों की प्रतियां बनाना होगा, और उन्हें नए ढेर में जोड़ना होगा।

आप full (or "deep") copies कर सकते हैं, clone विधि का उपयोग कर, लेकिन ध्यान दें कि वस्तु आदेश deep copies of objects प्राप्त करने के लिए Clonable इंटरफ़ेस को लागू करना होगा।

18

StackVector फैली हुई है, तो आप कर सकते हैं बस नया एक नया Stack और .addAll(...) का उपयोग आइटम कॉपी करने के लिए:

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

वाह ने इसके बारे में सोचा नहीं था, धन्यवाद! –

+3

यह सदस्य आइटम की प्रतिलिपि नहीं करेगा। दोनों ढेर एक ही स्ट्रिंग्स पर इंगित करेंगे। –

+2

स्ट्रिंग्स अपरिवर्तनीय हैं, इसलिए स्ट्रिंग की एक प्रति बनाना किसी की भी मदद नहीं करता है। – msandiford

संबंधित मुद्दे