2012-07-01 16 views
6

मेरा प्रश्न है: यह निर्धारित करने का एक तेज़ तरीका क्या है कि Collection में कोई संख्या निहित है या नहीं, यह जानने के लिए कि संग्रह में इसे जोड़ना और विशिष्टता बनाए रखना है या नहीं। अगर मैं इसकी मदद कर सकता हूं तो मैं सूची के माध्यम से पुन: प्रयास नहीं करूंगा।अद्वितीय पूर्णांक स्टोर करने का अच्छा तरीका

मेरे पास List<Integer> है numberList कहा जाता है। मैं इसे अद्वितीय पूर्णांक स्टोर करना चाहता हूं और डुप्लीकेट को जोड़ने की अनुमति नहीं देता हूं। मैं कुछ इस तरह करना चाहते हैं:

private void add(int number) { 
    if (!numberList.contains(number)) { 
    numberList.add(number); 
    } 
} 

लेकिन स्पष्ट रूप से यह अभ्यस्त काम क्योंकि numberList संख्या की तो परवाह किए बिना प्रत्येक एक अद्वितीय वस्तु है Integer वस्तुओं की एक सूची में शामिल है।

धन्यवाद!

+0

मुझे लगता है कि 'शामिल (...)' विधि ऑब्जेक्ट की 'बराबर (...)' विधि का उपयोग यह देखने के लिए करती है कि यह संग्रह द्वारा आयोजित किया गया है या नहीं, इसलिए ऊपर दी गई विधि को डुप्लिकेट को भी रोकना चाहिए। –

+0

हू, हो सकता है कि मेरे कोड के साथ कुछ और गलत हो जो अप्रत्याशित परिणाम प्रदान कर रहा हो। पारितोषिक के लिए धन्यवाद! – kentcdodds

+1

यदि आपका कोड मेरा जैसा है, तो * हमेशा * कुछ और गलत है! अगर आपको इसे खोजने में मदद की ज़रूरत है तो कृपया अधिक जानकारी के साथ वापस आएं! –

उत्तर

12

एक इंटेगर को Set<Integer> में में स्टोर करना है। सेट डुप्लिकेट की अनुमति नहीं देते हैं।

संपादित
इसके अलावा , संग्रह के contains(...) विधि वस्तु की बराबरी (...) विधि का उपयोग करता है, तो यह है या नहीं संग्रह द्वारा आयोजित किया जाता है देखने के लिए है, तो आपके विधि से ऊपर के साथ-साथ अगर आप की जरूरत है डुप्लिकेट नहीं कर पाएगा, अपने संग्रह के रूप में एक सूची का उपयोग करने के लिए। इसे स्वयं से जांचें और आप इसे देखेंगे।

उदाहरण के लिए:

List<Integer> numberList = new ArrayList<Integer>(); 
    int[] myInts = {1, 1, 2, 3, 3, 3, 3, 4}; 
    for (int i : myInts) { 
    if (!numberList.contains(i)) { 
     numberList.add(i); 
     } 
    } 

    System.out.println(numberList); 

वापस आ जाएगी: [1, 2, 3, 4]

इसके अलावा, HashSets के साथ एक संभावित समस्या यह है कि वे आदेश दिया नहीं कर रहे हैं, इसलिए यदि आदेश महत्वपूर्ण है, आप को देखने के लिए चाहता हूँ आदेशित सेट की अन्य किस्मों में से एक का उपयोग करना।

+0

जिज्ञासा से, आप कौन सा कार्यान्वयन तेजी से सोचते हैं? क्या डुप्लिकेट के साथ 'सेट' सौदे को जोड़ने या जोड़ने से पहले सूची में 'शामिल' का उपयोग करना तेज होगा? – kentcdodds

+0

@kentcdodds: मेरा मानना ​​है कि हैशसेट तेजी से होगा क्योंकि हैशिंग एक बहुत ही तेज ऑपरेशन है, लेकिन मैं 100% आश्वासन के साथ नहीं कह सकता क्योंकि मैंने कभी भी एल्गोरिदम के लिए बड़े ओ का अध्ययन नहीं किया है। लेकिन चारों ओर लटका, कंप्यूटर वैज्ञानिकों में से एक जल्द ही इसका उत्तर देगा, इसमें कोई संदेह नहीं है। –

+0

युक्तियों के लिए धन्यवाद! – kentcdodds

3

सबसे कॉम्पैक्ट फॉर्म BitSet नहीं होगा? यह भंडारण के मामले में कुशल है क्योंकि यह अनिश्चित काल तक विस्तारित होगा। यह अनावश्यक रूप से भंडारण का भी उपयोग नहीं करेगा।

क्या आप एक बहु थ्रेडेड वातावरण में काम कर रहे हैं? यदि ऐसा है तो अन्य संरचनाएं हैं जो बेहतर/अधिक कुशल हो सकती हैं।

+0

तुमने मुझे मिल गया! यह एक बहु थ्रेडेड वातावरण है, यही कारण है कि मैं यह कर रहा हूं। मैं यह जांचना चाहता हूं कि एक थ्रेड पहले ही नंबर जोड़ चुका है या नहीं। – kentcdodds

+0

उस स्थिति में आप लगभग निश्चित रूप से 'ConcurrentHashMap' की तलाश में हैं, शायद [newSetFromMap] (http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html का उपयोग करके व्युत्पन्न सेट में लपेटा गया है) # newSetFromMap% 28java.util.Map% 29) लेकिन यदि आप चाहें तो 'हमेशा' मानचित्र 'में' बूलेन.TRUE' जोड़ सकते हैं। – OldCurmudgeon

+1

बिट्ससेट संख्याओं के छोटे, घने सेट के लिए बहुत ही कुशल है। लेकिन 'नया बिटसेट()। जोड़ें (Integer.MAXVALUE); पहले से ही 268 एमबी आवंटित करता है। तो इसे ध्यान से इस्तेमाल किया जाना चाहिए। – Arne

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

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