2010-06-08 12 views
6

क्या javaK या apache commons में java.util.List से तत्वों की सूची "पॉप" करने का कोई तरीका है? मैं, मतलब तत्वों की सूची को हटा दें और इसे वापस, इस पद्धति की तरह:जावा में संग्रह से आइटम कैसे पॉप करें?

public Collection pop(Collection elementsToPop, Collection elements) { 

    Collection popped = new ArrayList(); 

    for (Object object : elementsToPop) { 
    if (elements.contains(object)) { 
     elements.remove(object); 
     popped.add(object); 
    } 
    } 

    return popped; 
} 
+2

ध्यान दें कि आप निकालने का परिणाम परीक्षण कर सकते हैं() करो और छोड़ अपने कोड में जांच में शामिल है। –

+1

संग्रह के साथ काम करने के लिए आप [जेनरिक] (http://java.sun.com/docs/books/tutorial/java/generics/index.html) में भी देखना चाह सकते हैं। – Pops

उत्तर

10

आप एक ढेर की तरह संरचना मैं एक Deque (LinkedList है सबसे आम कार्यान्वयन) को स्वीकार करने का सुझाव देते हैं के लिए देख रहे हैं एक के बजाय Collection

आप वास्तव में, एक ढेर के रूप में यह इलाज सिर्फ Collection से पुनरावर्तक हो और remove() विधि का उपयोग करने की जरूरत नहीं है:

for (Iterator<SomeType> it = elements.iterator(); it.hasNext();) { 
    SomeType e = it.next(); 
    it.remove(); 
    popped.add(e); 
} 

टिप्पणी को हटा एक वैकल्पिक ऑपरेशन है, और कुछ कार्यान्वयन UnsupportedOperationException फेंक सकता है (उदाहरण के लिए, Collections.unmodifiable...() से संग्रह द्वारा लौटाया गया इटरेटर) होगा।

संपादित: अपने प्रश्न पर और अधिक बारीकी से देखने के बाद, मुझे लगता है कि आप सिर्फ इस की जरूरत है:

elements.removeAll(elementsToRemove); 

यदि आपका मुख्य बिंदु आप को पता है कि वास्तव में जो तत्वों वास्तव में पॉप कर रहे थे, मुझे लगता है कि जरूरत है आप अपने मूल कोड से फंस गए हैं।

+1

असल में, ऐसा प्रतीत होता है कि मैंने पर्याप्त रूप से पर्याप्त नहीं पढ़ा। आपके पास "पॉप" की एक बहुत ही गैर-मानक परिभाषा है जो मुझे इस उत्तर को पोस्ट करने के लिए गुमराह करती है। अधिक लागू उत्तर आ रहा है। –

+0

मुझे पता है कि "पॉप" उपयोग करने का सबसे अच्छा शब्द नहीं था, इसलिए मैंने जो कुछ भी चाहता था उसका एक उदाहरण दिया। लेकिन ऐसा लगता है कि जेडीके या अपाचे कॉमन्स के लिए इसे लागू करने की कोई विधि नहीं है, इसलिए, अब तक, मेरे साथ जारी रहेगी, और मैं आपके इटरेटर संकेत का उपयोग करूंगा, धन्यवाद! घटाने के लिए –

1

मुझे नहीं लगता, क्योंकि आप 'पॉप' ऑपरेशन की परिभाषा अत्यधिक गैर-मानक है। आम तौर पर इसमें कोई तर्क नहीं होता है (संग्रह को छोड़कर) और शीर्ष पर सबसे अधिक रिटर्न और हटा देता है।

लेकिन एक बार जब आप अपाचे कॉमन्स देखते हैं, तो यह आपके कोड के समान प्रभाव प्राप्त करेगा।

Collection result = CollectionUtils.intersection(a, b); 
a.removeAll(b); 

संपादित
http://commons.apache.org/collections/api-release/index.html

0

वहाँ एक विधि वास्तव में की तरह आप के लिए क्या पूछ रहे हैं नहीं है, लेकिन ऐसा लगता है कि आप पहले से ही बहुत अपने कोड के साथ करीब हैं।

कुछ सुझाव:

  • जब से तुम जैसे डुप्लिकेट निकालने की जरूरत हो सकती removeAll (वस्तु) को हटाने के बजाय (वस्तु) का उपयोग करते हुए अगर तत्वों एक मनमाना संग्रह है पर विचार करें यदि तत्व एक सूची है।

  • में कुछ संग्रह प्रकारों (उदा। सूचियों) के लिए धीमा है (क्योंकि सूचियां) क्योंकि इसे संपूर्ण डेटा संरचना को पार करने की आवश्यकता है। यह देखते हुए कि यह आपके भीतर के पाश में है, आपको ओ (एन^2) प्रदर्शन के मुद्दों का खतरा है। यदि आप एल्गोरिदम को हैशसेट या हैश मैप के साथ काम कर सकते हैं तो इसमें() द्वारा()) होगा और आपका एल्गोरिदम अधिक कुशल होगा।

2

मानक जेडीके-प्रदत्त विधियों में ऐसी कोई विधि नहीं है। अपाचे कॉमन्स the ListUtils.subtract() method प्रदान करता है।

संपादित करें: जैसा कि अन्य उत्तरदाताओं ने ध्यान दिया है, pop शब्द का उपयोग गैर मानक है।आमतौर पर,

पॉप आपरेशन [एक ढेर]

विकिपीडिया nice description of stacks है के ऊपर से एक आइटम को हटा।

+1

+1; हटाएं सभी पोस्टर के स्निपेट की तरह कार्डिनलिटी का सम्मान नहीं करते हैं। लेकिन यह आपको उन तत्वों की एक सूची नहीं देता है जो वास्तव में उनके कार्यों की तरह हटा दिए गए थे। –

+0

@ मार्क, एचएम, आप सही हैं; मैंने विवरण पढ़ा लेकिन स्रोत नहीं, और गलत समझा। +1, मैं देख रहा हूँ। – Pops

1

लिंक्ड लिस्ट कार्यक्षमता प्रदान करता है जैसा आपको चाहिए, पुश और पॉप विधि प्रदान करता है।

प्रदान की documentation को देखें:

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