2010-01-21 15 views
9

क्या सेट संग्रह में डुप्लिकेट मानों को अनुमति देना संभव है?सेट संग्रह में डुप्लिकेट मान?

क्या तत्वों को अद्वितीय बनाने और उनमें से कुछ प्रतियां बनाने का कोई तरीका है? क्या इसमें डुप्लिकेट मान रखने के लिए सेट संग्रह के लिए कोई फ़ंक्शन है?

+1

आप सेट में एकाधिक मान क्यों स्टोर करना चाहते हैं? शायद आप जो हासिल करने की कोशिश कर रहे हैं उसका एक उदाहरण मदद करेगा। – Cuga

+4

मुझे लगता है कि आपने ** सेट ** शब्द के पूरे अर्थ को गलत समझा। यदि आप डुप्लीकेट चाहते हैं तो एक सूची का उपयोग करें। – BalusC

उत्तर

25

कभी भी java.util.List का उपयोग करने पर विचार किया जाता है?

अन्यथा मैं एक MultisetGoogle Guava से सिफारिश करेंगे (Google Collections है, जो इस सवाल का जवाब मूल रूप से एड की सिफारिश के लिए उत्तराधिकारी।)।

+1

क्या सेट के साथ कुछ करने और एकाधिक मान रखने का कोई तरीका है? – Johanna

+5

@ रोगर, आपका मल्टीसेट लिंक स्रोत कोड के एक प्राचीन संस्करण को इंगित करता है। यहां नवीनतम जवाडोक के लिए एक लिंक दिया गया है: http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Multiset.html –

+1

Rojer सही है। Java.util.List (preffered) कुछ तीसरे पक्ष पुस्तकालय का प्रयास करें। Google के संग्रह API के अलावा, आप उपयोगकर्ता नाम/पासवर्ड के बिना अपाचे कॉमन्स संग्रह का उपयोग कर सकते हैं। नीचे मेरा जवाब देखें। –

1

मुझे विश्वास नहीं है कि आपके पास एक सेट के भीतर डुप्लिकेट मान हो सकते हैं। एक सेट को अद्वितीय मूल्यों के संग्रह के रूप में परिभाषित किया जाता है। आप एक ArrayList का उपयोग कर बेहतर हो सकता है।

0

मुझे ऐसा नहीं लगता है। एक सूची का उपयोग करने का एकमात्र तरीका होगा। आप फ़ंक्शन बराबर(), हैशकोड() या तुलना करने के लिए भी ट्रिक कर सकते हैं() लेकिन यह अजीब होने जा रहा है।

12

सेट के बहुत definition डुप्लीकेट को अस्वीकार करता है। मुझे लगता है कि शायद आप List जैसे अन्य डेटा संरचना का उपयोग करना चाहते हैं, जो डुप्लिकेट की अनुमति देगा।

क्या तत्वों को अद्वितीय बनाने और उनमें से कुछ प्रतियां बनाने का कोई तरीका है?

किसी कारण से आप वास्तव में एक सेट में डुप्लिकेट स्टोर करने के लिए जरूरत है, तो आप या तो उन्हें धारक वस्तु के कुछ प्रकार में लपेट, वरना के) बराबर ओवरराइड (और hashCode() की आवश्यकता होगी आपकी मॉडल ऑब्जेक्ट्स ताकि वे बराबर मूल्यांकन न करें (और कि विफल हो जाएंगे यदि आप एक ही भौतिक वस्तु के संदर्भों को कई बार संग्रहीत करने का प्रयास कर रहे हैं)।

मुझे लगता है कि आपको यहां पूरा करने की कोशिश कर रहे हैं, या कम से कम इसे स्पष्ट रूप से समझाएं।

0

कोई मौका नहीं .... आप सेट इंटरफ़ेस में डुप्लिकेट मान नहीं हो सकता ... आप डुप्लिकेट चाहते हैं तो आपको सरणी-सूची

2

कोशिश कर सकते हैं javadocs से:

"सेट तत्वों E1 का कोई युग्म और e2 ऐसी है कि e1.equals (E2) होते हैं, और सबसे एक null तत्व "

इसलिए यदि आपके वस्तुओं ओवरराइड करने के लिए थे पर। बराबर() ताकि यह आपके द्वारा संग्रहीत करने की इच्छा रखने वाली वस्तुओं के लिए अलग-अलग मान वापस कर दे, फिर आप उन्हें Set में अलग से स्टोर कर सकते हैं (आपको हैशकोड() को भी ओवरराइड करना चाहिए)।

हालांकि, के जावा में एक Set बहुत परिभाषा

"है कि कोई डुप्लिकेट तत्व शामिल हैं एक संग्रह।"

तो तुम एक List या का उपयोग कर बंद वास्तव में बेहतर कर रहे हैं यहाँ कुछ और।शायद Map, यदि आप विभिन्न कुंजी के आधार पर डुप्लिकेट मानों को संग्रहीत करना चाहते हैं।

2

सूर्य की दृश्य "बैग" (उर्फ multisets) पर:

हम प्रकार- सुरक्षित संग्रह के लिए इच्छा के लिए अत्यंत सहानुभूति है। फ्रेमवर्क में "बैंड-एड्स" जोड़ने की बजाय जो विज्ञापन-शैली में टाइप-सुरक्षा को लागू करता है, ढांचे को वर्तमान में चर्चा किए जा रहे सभी पैरामीटरयुक्त प्रकार के प्रस्तावों के साथ जाल के लिए डिज़ाइन किया गया है। यदि पैरामीटर प्रकार को भाषा में जोड़ा जाता है, तो पूरे संग्रह ढांचे में संकलित-समय प्रकार-सुरक्षित उपयोग का समर्थन किया जाएगा, जिसमें स्पष्ट रूप से कोई आवश्यकता नहीं है। दुर्भाग्य से, यह 1.2 रिलीज में नहीं होगा। इस बीच, जो लोग रनटाइम प्रकार की सुरक्षा चाहते हैं वे जेडीके संग्रहों के आस-पास "रैपर" संग्रह में अपने स्वयं के गेटिंग फ़ंक्शंस को कार्यान्वित कर सकते हैं।

(source, ध्यान दें यह पुरानी और संभवतः अप्रचलित एड है।)

अलावा गूगल के संग्रह एपीआई से, आप अपाचे कॉमन्स संग्रह का उपयोग कर सकते हैं।

अपाचे कॉमन्स संग्रह:

http://commons.apache.org/collections/

Javadoc for Bag

+1

उन शब्दों ("सूर्य का विचार") बहुत समय पहले जोश ब्लोच द्वारा लिखे गए थे। तब से उन्होंने अपनी धुन और अनिवार्य रूप से सह-डिज़ाइन किए गए Google संग्रह 'मल्टीसेट को बदल दिया। –

+0

उपरोक्त कथन में अनिवार्य रूप से क्या सूर्य का अर्थ यह है कि इस प्रकार के परिदृश्य के लिए यह बहुत दुर्लभ है, लेकिन अगर कुछ एप्लिकेशन को वास्तव में ऐसा कुछ चाहिए तो इसे कस्टम फैशन द्वारा लागू किया जा सकता है या तृतीय पक्ष लाइब्रेरी का उपयोग किया जा सकता है (जैसे अपाचे संग्रह या Google संग्रह) जो इसके साथ कोर एपीआई को अव्यवस्थित करने की बजाए करता है। और मुझे नहीं लगता कि सूर्य ने इस दृश्य को किसी भी तरह बदल दिया है, क्योंकि "बैग" (एकेए मल्टीसेट) अभी भी नवीनतम जावा -6 के रूप में जेआरई का हिस्सा नहीं हैं। –

0

जैसा कि बताया जा कार्य के लिए सही संग्रह चुनते हैं और संभावना एक सूची हो जाएगा कि तुम क्या जरूरत है। बराबर(), हैशकोड() या तुलना करने के लिए तुलना() की पहचान करना आम तौर पर गलत संग्रह में एक उदाहरण को शुरू करने के लिए एक बुरा विचार है। इससे भी बदतर यह एप्लिकेशन के अन्य क्षेत्रों में कोड तोड़ सकता है जो वैध तुलना परिणामों के उत्पादन के इन तरीकों पर निर्भर करता है और ऐसी त्रुटियों को डीबग या ट्रैक करना बहुत कठिन होता है।

0

यह प्रश्न मुझे एक साक्षात्कार में भी मुझसे पूछा गया था। मुझे लगता है कि जवाब है, का सेट सेट डुप्लिकेट तत्वों की अनुमति नहीं देगा और इसके बजाय ऐरेलिस्ट या अन्य संग्रहों का उपयोग उसी के लिए किया जाना चाहिए, हालांकि सेट में संग्रहीत ऑब्जेक्ट के प्रकार के लिए ओवरराइडिंग बराबर() को तुलना करने से आप तुलना में हेरफेर कर सकते हैं तर्क। और इसलिए आप सेट में डुप्लिकेट तत्वों को स्टोर करने में सक्षम हो सकते हैं। यह एक हैक का अधिक है, जो उत्पादन स्तर कोड में सेट और ऑर्कोर्स में गैर-अद्वितीय तत्वों की अनुशंसा नहीं करता है।

0

नीचे दिए गए के रूप में आप hashCode अधिभावी करके कर सकते हैं:

public class Test 
{ 
    static int a=0; 

    @Override 
    public int hashCode() 
    { 
     a++; 
     return a; 
    } 

    public static void main(String[] args) 
    { 
     Set<Test> s=new HashSet<Test>(); 
     Test t1=new Test(); 
     Test t2=t1; 
     s.add(t1); 
     s.add(t2); 
     System.out.println(s); 
     System.out.println("--Done--"); 
    } 
} 
+1

कृपया – johannes

+0

समझाएं और यह हैशकोड के पोस्टकंडिशन का उल्लंघन करता है, उदा। कि यह प्रत्येक वस्तु के लिए लगातार है ... जो कहने का एक मामूली तरीका है "यह एक पूरी तरह से टूटा हुआ सेट है जिसे आप वास्तव में कुछ भी नहीं कर सकते हैं।" – djechlin

+0

यह काफी बदसूरत है। यह हैशकोड() और बराबर() के अनुबंध को तोड़ता है। –

-1
public class SET { 

    public static void main(String[] args) { 
     Set set=new HashSet(); 
     set.add(new AB(10, "[email protected]")); 
     set.add(new AB(10, "[email protected]")); 
     set.add(new AB(10, "[email protected]")); 
     Iterator it=set.iterator(); 
     while(it.hasNext()){ 
      Object o=it.next(); 
      System.out.println(o); 
     } 
    } 
} 

public class AB{ 

    int id; 
    String email; 

    public AB() { 
     System.out.println("DC"); 
    } 

    AB(int id,String email){ 
     this.id=id; 
     this.email=email; 
    } 

    @Override public String toString() { 
     // TODO Auto-generated method stub return ""+id+"\t"+email;} 
    } 
} 
+0

वे डुप्लिकेट आइटम नहीं हैं, क्योंकि 'a.equals (बी) 'झूठी रिटर्न देता है। मैं कुछ कोड स्वरूपण करने की भी सिफारिश करता हूं। – corsiKa

+0

उस कोड को स्वरूपित करें और बताएं कि यह क्या करता है। – ElderMael

+0

हालांकि यह कोड स्निपेट प्रश्न हल कर सकता है, [एक स्पष्टीकरण सहित] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और वे लोग आपके कोड सुझाव के कारणों को नहीं जानते हैं। – msrd0

0

साक्षात्कार प्रश्न की तरह इन ध्वनि, तो मैं उन्हें साक्षात्कार प्रश्न की तरह जवाब देंगे ...

Is it possible to allow duplicate values in the Set collection? 

हां, लेकिन यह आवश्यक है कि Set लागू करने वाले व्यक्ति डिज़ाइन अनुबंध का उल्लंघन करें जिस पर Set बनाया गया है। असल में, मैं एक वर्ग लिख सकता हूं जो Set बढ़ाता है और Set के वादे को लागू नहीं करता है।

इसके अतिरिक्त, अन्य उल्लंघन संभव हैं। मैं Set कार्यान्वयन का उपयोग कर सकता हूं जो जावा के hashCode() अनुबंध पर निर्भर करता है।फिर यदि मैंने Object प्रदान किया जो जावा के हैशकोड अनुबंध का उल्लंघन करता है, तो मैं दो ऑब्जेक्ट्स को सेट में सेट करने में सक्षम हो सकता हूं, लेकिन अलग-अलग हैंशकोड (क्योंकि उन्हें अलग-अलग हैश बाल्टी में होने के कारण एक दूसरे के खिलाफ समानता में चेक नहीं किया जा सकता है । जंजीरों

Is there any way to make the elements unique and have some copies of them? 

यह मूल रूप से आप कैसे विशिष्टता को परिभाषित पर निर्भर करता है एक वस्तु की विशिष्टता अपने मूल्य द्वारा निर्धारित किया जाता है, तो है, तो एक ही अद्वितीय वस्तु की कई प्रतियां हो सकता है;। लेकिन, अगर वस्तु की अद्वितीयता से निर्धारित होता है इसके उदाहरण के लिए, फिर परिभाषा के अनुसार एक ही ऑब्जेक्ट की कई प्रतियां हो सकती हैं। हालांकि उनके पास एकाधिक संदर्भ हो सकते हैं।

Is there any functions for Set collection for having duplicate values in it? 

Set इंटरफ़ेस में डुप्लिकेट का पता लगाने/रिपोर्ट करने के लिए कोई फ़ंक्शन नहीं है; हालांकि, यह संग्रह इंटरफ़ेस पर आधारित है, जिसे सूची इंटरफ़ेस का समर्थन करना है, इसलिए डुप्लिकेट को सेट में पास करना संभव है; हालांकि, एक उचित ढंग से कार्यान्वित Set सिर्फ डुप्लिकेट को अनदेखा कर देगा, और अद्वितीय होने के लिए निर्धारित प्रत्येक तत्व की एक प्रति प्रस्तुत करेगा।

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