2009-11-15 18 views
5

में दो संग्रहों के एक संयोजन को दर्शाता है क्या कोई वर्ग है जो किसी संग्रह के साथ संग्रह के संयोजन को दर्शाता है? यह वर्ग स्वयं में एक संग्रह होना चाहिए, और अंतर्निहित (आंतरिक) संग्रहों के लिए सभी विधियों को प्रस्तुत करना चाहिए - कोई अतिरिक्त स्मृति आवंटित नहीं की जानी चाहिए, न ही मूल संग्रह में से कोई भी संशोधित किया जाना चाहिए।एक संग्रह जो जावा

उदाहरण उपयोग:

Collection<String> foo = ... 
Collection<String> bar = ... 

// this should be O(1) memory and time 
Collection<String> combined = concat(foo, bar); 

if (combined.contains("Zee")) 
    ... 

for (String str : combined) 
    System.out.println(str); 
+0

आपका मतलब कुछ है जो पाइथन के इटारेटोल प्रदान करता है? –

+0

यह वास्तव में स्पष्ट नहीं है कि आप एक वर्ग चाहते हैं जो एक संग्रह और एक आइटम, दो संग्रह या क्या दर्शाता है .. – Jack

+0

एक वर्ग जो दो संग्रहों के संयोजन को दर्शाता है। – ripper234

उत्तर

0

मुझे यकीन है कि क्या आपके पूछने नहीं हूँ। आपके प्रश्न की मेरी व्याख्या यह है कि आप संग्रह पर ऐड विधि की तलाश में हैं। मुझे नहीं लगता कि आप यही पूछ रहे हैं।

+0

मैं ऐसे संग्रह की तलाश में हूं जो दो संग्रहों के संयोजन को समाहित करता है, _without_ स्मृति की एक महत्वपूर्ण मात्रा आवंटित या मूल संग्रह को संशोधित करता है। – ripper234

4

आपका प्रश्न बहुत अस्पष्ट है। विशेष रूप से "किसी अन्य आइटम के साथ एक और संग्रह" काफी अस्पष्ट है।

Collection#addAll() का उपयोग कर आप वर्तमान Collection पर Collection की सामग्री को कम से कम जोड़ सकते हैं। यहां Collection इसके सबिनटरफेस/कार्यान्वयन के कुछ भी हो सकता है, उदा। List या Set

उदाहरण:

List<String> foos = Arrays.asList("foo1", "foo2", "foo3"); 
List<String> bars = Arrays.asList("bar1", "bar2", "bar3"); 
foos.addAll(bars); // Now foos contains everything. 

संपादित: या आप वास्तव में बनाने के लिए चाहते हो एक नईCollection के आधार पर एक मौजूदा Collection और फिर इसे करने के लिए एक नया आइटम जोड़ने? इस मामले में कन्स्ट्रक्टर तर्क के रूप में मौजूदा Collection के साथ बस एक नया Collection बनाएं। उदा .:

List<String> foos = Arrays.asList("foo1", "foo2", "foo3"); 
List<String> bars = new ArrayList<String>(foos); 
bars.add("bar"); // Now bars contains everything. 
+0

मैं हमेशा तृतीय-पक्ष लाइब्रेरी के लिए जाने से पहले चीजों को करने के लिए देशी जावा पुस्तकालयों को पसंद करता हूं। –

2

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

उत्तर नहीं है, जावा में बॉक्स से कुछ भी नहीं है जो यह करता है ... हालांकि आप एक त्वरित रैपर लिख सकते हैं जो संग्रह की एक श्रृंखला को लपेटता है और उन संग्रहों को जोड़ता है। (यह सब कुछ संग्रहों के संदर्भ बनाए रखेगा) और आप आवश्यकतानुसार प्राप्त/सम्मिलित विधियों का पर्दाफाश कर सकते हैं।

+0

वास्तव में मैं जो खोज रहा हूं ... यह सोच रहा था कि ऐसी लाइब्रेरी है या नहीं। – ripper234

9

हमेशा किसी भी संग्रह सामग्री के लिए, google-collections पर देखें। आप Set है, विशेष रूप से (न केवल एक सामान्य संग्रह) है, तो आप चाहते हैं:

Set<String> combined = Sets.union(foo, bar); 

जो दो सेट के unmodifiable दृश्य बनाता है। यही है, foo या bar में परिवर्तन combined में दिखाई देंगे (लेकिन combined.add() आदि समर्थित नहीं है)।

अधिक सामान्य मामले के लिए, आप Iterables.concat() है, लेकिन है कि केवल आप में शामिल हो गए आइटम पर पुनरावृति की सुविधा देता है, Iterable इंटरफ़ेस स्पष्ट रूप से शामिल नहीं है contains तो आप एक छोटे से वहाँ hosed हो।

Google संग्रह में अन्य संग्रह उपयोगिता कक्षाएं (com.google.common.collect.Lists और com.google.common.collect.Collections2) में कोई समेकन विधियां नहीं हैं। नहीं देखते कि वे क्यों नहीं कर सके, लेकिन फिलहाल वे नहीं करते।

+4

हमने पाया कि 99% समय, उपयोगकर्ताओं को वास्तव में फिर से शुरू करने की आवश्यकता है। इसलिए Iterables.concat()। आंतरिक रूप से हमारे पास एक लिस्ट.कोनकैट() भी है लेकिन कड़ी मेहनत से इसका कोई भी उपयोग नहीं करता है, और जो लोग करते हैं वे वैसे भी दूसरे का इस्तेमाल कर सकते थे। –

3

वहाँ नहीं है, लेकिन इसे लिखने खुद सीधे आगे

package ch.akuhn.util; 

import java.util.Iterator; 
import java.util.NoSuchElementException; 

public class Concat { 

    public static <T> Iterable<T> all(final Iterable<T>... iterables) { 
     return new Iterable<T>() { 
      @Override 
      public Iterator<T> iterator() { 
       return new Iterator<T>() { 
        Iterator<Iterable<T>> more = Arrays.asList(iterables).iterator(); 
        Iterator<T> current = more.hasNext() ? more.next().iterator() : null; 
        @Override 
        public boolean hasNext() { 
         if (current == null) return false; 
         if (current.hasNext()) return true; 
         current = more.hasNext() ? more.next().iterator() : null; 
         return this.hasNext(); 
        } 

        @Override 
        public T next() { 
         if (!hasNext()) throw new NoSuchElementException(); 
         return current.next(); 
        } 

        @Override 
        public void remove() { 
         throw new UnsupportedOperationException(); 
        } 
       }; 
      } 
     }; 
    } 

} 

और फिर

for (Object each: Concat.all(collection,whatever,etcetera,...)) { 
    // ... 
} 

बस यहाँ इस कोड लिखा होना चाहिए, अपने जोखिम पर संकलन!

पीएस, यदि आप इस कक्षा के लिए यूनिट परीक्षण लिखेंगे, तो मुझे भेजें।

2

Apache Commons Collections भी एक अधिक सामान्य CompositeCollection वर्ग जो Collection रों की एक मनमाना संख्या के लिए एक इंटरफेस के रूप में इस्तेमाल किया जा सकता है।

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