Java.util.Set को (int index) क्यों नहीं मिला?


237

मुझे यकीन है कि एक अच्छा कारण है, लेकिन क्या कोई यह बता सकता है कि java.util.Setइंटरफ़ेस की कमी get(int Index)या किसी समान get()विधि क्यों है?

ऐसा लगता है कि चीजें सेट करने के लिए सेट बहुत अच्छे हैं, लेकिन मैं इसमें से एक भी आइटम को प्राप्त करने का एक सुंदर तरीका नहीं खोज सकता।

अगर मुझे पता है कि मैं पहला आइटम चाहता हूं, तो मैं उपयोग कर सकता हूं set.iterator().next(), लेकिन अन्यथा ऐसा लगता है कि मुझे एक विशिष्ट सूचकांक पर एक आइटम को पुनः प्राप्त करने के लिए एक अर्रे में डालना है?

एक सेट से डेटा प्राप्त करने के उपयुक्त तरीके क्या हैं? (एक पुनरावृत्ति का उपयोग करने के अलावा)

मुझे यकीन है कि यह एपीआई से बाहर रखा गया है इसका मतलब यह है कि ऐसा नहीं करने का एक अच्छा कारण है - क्या कोई कृपया मुझे बता सकता है?

संपादित करें: कुछ बेहद शानदार जवाब यहाँ, और कुछ "अधिक संदर्भ" कह रहे हैं। विशिष्ट परिदृश्य एक dbUnit परीक्षण था, जहाँ मैं यथोचित जोर दे सकता था कि क्वेरी से लौटे सेट में केवल 1 आइटम था, और मैं उस आइटम को एक्सेस करने का प्रयास कर रहा था।

हालांकि, यह प्रश्न परिदृश्य के बिना अधिक मान्य है, क्योंकि यह अधिक केंद्रित है:

सेट और सूची में क्या अंतर है

नीचे शानदार जवाब के लिए सभी को धन्यवाद।


1
आप सूचकांक द्वारा एक सेट से एक तत्व क्यों प्राप्त करेंगे? क्या आप एक सेट को एक क्रमबद्ध सरणी के रूप में उपयोग करने की कोशिश कर रहे हैं?
एमएसएन

यहाँ विशेष रूप से हाइबरनेट कॉल से लौटे सेट के खिलाफ एक dbUnit परीक्षण है। मेरे परीक्षण में, यह मान लेना उचित है (क्योंकि मैं इसे मुखर करता हूं) कि लौटाई गई वस्तु एक विशिष्ट क्रम में है, क्योंकि मेरे आईडीटासेट के कारण मैं इसे स्थापित करता था। यह एक गैर-विशिष्ट मामला है, लेकिन एपीआई के बारे में मेरी जिज्ञासा है।
मार्टी पिट

1
एक विशिष्ट क्रम में चीजों को जोड़ने का मतलब यह नहीं है कि वे उस तरह से रहेंगे, जब तक आप एक कस्टम सेट कार्यान्वयन का उपयोग नहीं कर रहे हैं।
माइकल मायर्स

1
"अगर मुझे पता है कि मैं पहला आइटम चाहता हूं, तो मैं set.iterator () का उपयोग कर सकता हूं। अगला ()" - यह लाइन वास्तव में कोई मतलब नहीं है। आप वास्तव में कह रहे हैं "यदि मुझे पता है कि मैं पहले आइटम को लागू करना चाहता हूं, तो पहले आइटम की कार्यान्वयन की परिभाषा से, फिर मैं कर सकता हूं ..."। सेट अप स्वयं अनियंत्रित है, इसलिए अनुक्रमित पहुंच का कोई मतलब नहीं है। अब अगर कोई ArrayListSet होता, तो अधिक समझ में आता (सिर्फ "सूची" और खुश रहने के लिए)। शायद आप प्रश्न के लिए अधिक संदर्भ दे सकते हैं?
०२:२५

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

जवाबों:


176

क्योंकि सेट का कोई ऑर्डर नहीं है। कुछ कार्यान्वयन (विशेषकर java.util.SortedSetइंटरफ़ेस को लागू करने वाले ) करते हैं, लेकिन यह सेट की एक सामान्य संपत्ति नहीं है।

यदि आप इस तरह सेट का उपयोग करने की कोशिश कर रहे हैं, तो आपको इसके बजाय एक सूची का उपयोग करने पर विचार करना चाहिए।


10
@matt b: नहीं, मुझे लगता है कि उसे इस पर विचार करना चाहिए। सोच अच्छी है। ;)
माइकल मायर्स

10
इस पर विचार करें, फिर करें।
जो फिलिप्स

21
"विचार करें" सही वाक्यांश है। दो संभावित समस्याएं हैं (ए) वह एक सेट का उपयोग कर रहा है जब उसे कुछ और उपयोग करना चाहिए, या (बी) वह सेट्स के साथ ऐसी चीजें करने की कोशिश कर रहा है जो वे समर्थन नहीं करते हैं लेकिन वह एक अलग तरीके से कर सकता है। यह विचार करना अच्छा है कि इनमें से कौन सा मामला है।
kenj0418

6
हो सकता है कि सरल उत्तर एक हल किए गए सेट का उपयोग करना हो। (मुझे लगता है कि सेट का चयन करते समय विशिष्टता ने एक भूमिका निभाई)। लेकिन मेरे पास एक प्रश्न है, चूंकि SortedSet का आदेश दिया गया है, इसलिए है कि एपी में कोई विधि नहीं है।
अप्रतिष्ठित_बदलें

5
@ एचडी: नहीं, तथ्य यह है कि एक डेटा संरचना के कई कार्यान्वयन एक संपत्ति को साझा करते हैं, यह स्वयं डेटा संरचना की संपत्ति नहीं बनाता है। सूची (ArrayList और वेक्टर) के तीन आमतौर पर उपयोग किए जाने वाले कार्यान्वयनों में से दो यादृच्छिक-अभिगम योग्य हैं, लेकिन यह यादृच्छिक पहुँच को सूचियों की संपत्ति नहीं बनाता है।
माइकल मायर्स

74

वास्तव में यह एक आवर्ती प्रश्न है जब JavaEE अनुप्रयोगों को लिखा जाता है जो ऑब्जेक्ट-रिलेशनल मैपिंग का उपयोग करते हैं (उदाहरण के लिए हाइबरनेट के साथ); और यहां से जवाब देने वाले सभी लोगों से, एंड्रियास पीटरसन ही एकमात्र ऐसा व्यक्ति है जिसने वास्तविक मुद्दे को समझा और इसके सही उत्तर की पेशकश की: जावा एक यूनिकलिस्ट गायब है! (या आप इसे ऑर्डरडसेट, या इंडेक्ससैट भी कह सकते हैं)।

मैक्सविंग ने इस उपयोग-मामले का उल्लेख किया है (जिसमें आपको ऑर्डर किए गए और अद्वितीय डेटा की आवश्यकता होती है) और उन्होंने SortedSet का सुझाव दिया, लेकिन यह वह नहीं है जो मार्टी पिट को वास्तव में चाहिए था।

यह "IndexedSet" एक SortedSet के समान नहीं है - एक SortedSet में तत्वों को एक तुलनित्र का उपयोग करके (या उनके "प्राकृतिक" आदेश का उपयोग करके) सॉर्ट किया जाता है।

लेकिन इसके बजाय यह एक लिंक्डहैसेट (जो दूसरों ने भी सुझाव दिया) के करीब है, या इससे भी अधिक (भी असंगत) "एरेइलिस्टसेट", क्योंकि यह गारंटी देता है कि तत्वों को उसी क्रम में वापस कर दिया जाता है जैसा कि उन्हें डाला गया था।

लेकिन LinkedHashSet एक कार्यान्वयन है, न कि कोई इंटरफ़ेस! क्या आवश्यक है एक IndexedSet (या ListSet, या OrderedSet, या UniqueList) इंटरफ़ेस! यह प्रोग्रामर को यह निर्दिष्ट करने की अनुमति देगा कि उसे ऐसे तत्वों के संग्रह की आवश्यकता है जिनके पास एक विशिष्ट क्रम है और बिना डुप्लिकेट के है, और फिर इसे किसी भी कार्यान्वयन के साथ त्वरित करें (उदाहरण के लिए हाइबरनेट द्वारा प्रदान किया गया कार्यान्वयन)।

चूंकि JDK ओपन-सोर्स है, शायद यह इंटरफ़ेस अंततः जावा 7 में शामिल किया जाएगा ...


3
जहां तक ​​यह जाता है, महान जवाब, लेकिन इस बीच हम क्या करते हैं?
एचडीवी

यकीन से यही है। मैंने पहले हाइबरनेट में manytomany और onetomany ORM के रूप में सूची का उपयोग किया था। मैं एक मुसीबत (या दोष) से ​​मिला, जब एक बाईं जुड़ाव क्वेरी में 3 से अधिक संबंधित इकाइयां शामिल थीं, तो एक अपवाद फेंक दिया गया था। अधिक जानकारी के लिए यहां देखें ( jroller.com/eyallupu/entry/… )। इस समस्या को हल करने के लिए, ORM मैपिंग संग्रह के रूप में सेट का उपयोग करना आवश्यक है। लेकिन ईमानदारी से कहूं तो, प्रोग्रामिंग में पहुँच के लिए सेट सुविधाजनक नहीं है, और यह भी कि आपको ऑर्डर कलेक्शन की आवश्यकता है। सोरिन पोस्टेलनिकु ने जैसा कहा, हमें वास्तव में "अनुक्रमित" की आवश्यकता है, SORT और UNIQUE
भयावह

2
अपाचे कॉमन्स कलेक्शंस में वह है ListOrderedSetजो ओपी को 7 साल पहले की जरूरत थी (और मुझे आज की जरूरत है)।
पॉल

@Paul: यह वास्तव में कुछ है जो वास्तव में अच्छा लग रहा है। दुर्भाग्य से इसमें अभी भी 3 कमियां हैं: 1) यह एक वर्ग है, एक इंटरफ़ेस नहीं है। 2) यह JDK में नहीं है। 3) यह नहीं है कि हाइबरनेट क्वेरी क्या लौट रही हैं।
Sorin Postelnicu

हाँ, लेकिन उन 3 प्रमुख कमियों के अलावा यह एकदम सही है! :) रेट्रोस्पेक्ट में मुझे अपनी टिप्पणी को प्रश्न पर पोस्ट करना चाहिए था और आपके उत्तर को नहीं - मैंने बंद किया What is needed is an IndexedSet (or ListSet, or OrderedSet, or UniqueList)...और अनदेखा कर दिया ...interface। उसके लिए माफ़ करना!
पॉल

29

बस एक बिंदु को जोड़ना जो कि mmyers के जवाब में उल्लेख नहीं किया गया था ।

अगर मुझे पता है कि मैं पहला आइटम चाहता हूं, तो मैं set.iterator () का उपयोग कर सकता हूं। अगला (), लेकिन अन्यथा ऐसा लगता है कि मुझे एक विशिष्ट सूचकांक पर एक आइटम को पुनः प्राप्त करने के लिए एक ऐरे में डालना होगा?

एक सेट से डेटा प्राप्त करने के उपयुक्त तरीके क्या हैं? (एक पुनरावृत्ति का उपयोग करने के अलावा)

आपको अपने आप को SortedSetइंटरफ़ेस (जिसका सबसे सामान्य कार्यान्वयन है TreeSet) के साथ परिचित होना चाहिए ।

एक SortedSet एक सेट है (अर्थात तत्व अद्वितीय हैं) जो तत्वों के प्राकृतिक आदेश द्वारा या कुछ का उपयोग करके रखा जाता है Comparator। आप आसानी से पहले और अंतिम आइटम का उपयोग कर first()और last()विधियों का उपयोग कर सकते हैं । ए SortedSetहर एक समय में एक बार काम में आता है, जब आपको अपने संग्रह को डुप्लिकेट-मुक्त और एक निश्चित तरीके से ऑर्डर करने की आवश्यकता होती है।

संपादित करें : यदि आपको एक सेट की आवश्यकता है जिसके तत्व सम्मिलन-क्रम में रखे गए हैं (एक सूची की तरह), तो एक नज़र डालें LinkedHashSet


मुझे खुद LinkedHashSet पसंद है। लेकिन हां, यह उल्लेख करना अच्छा है। +1
माइकल मायर्स

धन्यवाद, मैंने जवाब को थोड़ा घुमा दिया। (लगता है मैं TreeSet के कुछ पहलुओं LinkedHashSet के उन लोगों के साथ भ्रमित किया था।)
Jonik

25

इस तरह का सवाल यह है कि आपको एक सेट का उपयोग कब करना चाहिए और कब आपको एक सूची का उपयोग करना चाहिए। आमतौर पर, सलाह यह जाती है:

  1. यदि आपको ऑर्डर किए गए डेटा की आवश्यकता है, तो एक सूची का उपयोग करें
  2. यदि आपको अद्वितीय डेटा की आवश्यकता है, तो एक सेट का उपयोग करें
  3. यदि आपको दोनों की आवश्यकता है, तो या तो उपयोग करें: एक SortedSet (तुलनित्र द्वारा आदेशित डेटा के लिए) या एक OrderedSet / UniqueList (प्रविष्टि द्वारा आदेशित डेटा के लिए)। दुर्भाग्य से जावा एपीआई में अभी तक ऑर्डरडसेट / यूनीकलिस्ट नहीं है।

एक चौथा मामला जो अक्सर दिखाई देता है वह यह है कि आपको न तो आवश्यकता है। इस मामले में आप देखते हैं कि कुछ प्रोग्रामर सूचियों के साथ जाते हैं और कुछ सेट के साथ। व्यक्तिगत रूप से मुझे आदेश के बिना एक सूची के रूप में सेट देखना बहुत हानिकारक लगता है - क्योंकि यह वास्तव में एक पूरी तरह से अन्य जानवर है। जब तक आपको सेट अनूठेपन या सेट समानता जैसे सामान की आवश्यकता होती है, हमेशा सूचियों का पक्ष लें।


2
यदि आप अनिर्दिष्ट हैं, तो संग्रह <T> या यहां तक ​​कि Iterable <T> स्वीकार करें और सूची के रूप में प्रारंभ करें।
एंड्रियास पीटरसन

यह एक बैग या मल्टीसेट होगा। लेकिन जावा उन का समर्थन नहीं करता है; वे कहते हैं कि आपको सीधे संग्रह <T> का उपयोग करना चाहिए।
मैकेनिकल घोंघा

4. आपको गैर-विशिष्ट डेटा की आवश्यकता है, और ऑर्डर के बारे में परवाह न करें। आप एक सेट का उपयोग नहीं कर सकते। एक सूची, थैला या मल्टीसेट काम करेगा।
एंड्रयू गैलाश

17

मुझे यकीन नहीं है कि अगर किसी ने इसे ठीक तरह से समझा है, लेकिन आपको निम्नलिखित समझने की आवश्यकता है:

एक सेट में कोई "पहला" तत्व नहीं है।

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

बेशक, आपका कंप्यूटर वास्तव में सामान की एक सूची नहीं रख सकता है जिसे मेमोरी में ऑर्डर नहीं किया गया है। इसके लिए कुछ ऑर्डर देना होगा। आंतरिक रूप से यह एक सरणी या एक लिंक की गई सूची या कुछ है। लेकिन आप वास्तव में नहीं जानते कि यह क्या है, और इसमें वास्तव में पहला तत्व नहीं है; वह तत्व जो "पहले" बाहर आता है वह संयोग से उस रास्ते से निकलता है, और अगली बार पहली बार नहीं हो सकता है। यहां तक ​​कि अगर आपने किसी विशेष पहले तत्व को "गारंटी" करने के लिए कदम उठाए हैं, तो यह अभी भी संयोग से सामने आ रहा है, क्योंकि आप इसे एक सेट के एक विशेष कार्यान्वयन के लिए सही होने के लिए हुआ था; एक अलग क्रियान्वयन उस तरह से काम नहीं कर सकता है जैसा आपने किया था। और, वास्तव में, आप उस कार्यान्वयन को नहीं जानते होंगे जो आप उपयोग कर रहे हैं और साथ ही साथ आपको लगता है कि आप करते हैं।

लोग इस सभी में भागते हैं। । समय। RDBMS सिस्टम के साथ और समझ में नहीं आता। RDBMS क्वेरी रिकॉर्ड का एक सेट लौटाती है। यह गणित से एक ही प्रकार का सेट है: वस्तुओं का एक अनियंत्रित संग्रह, केवल इस मामले में आइटम रिकॉर्ड हैं। जब तक आप ORDER BY क्लॉज का उपयोग नहीं करते हैं, तब तक RDBMS क्वेरी परिणाम का कोई गारंटीकृत आदेश नहीं होता है, लेकिन हर समय लोग यह मान लेते हैं और फिर किसी दिन स्वयं यात्रा करते हैं जब उनके डेटा या कोड का आकार थोड़ा बदल जाता है और काम करने के लिए क्वेरी ऑप्टिमाइज़र को ट्रिगर करता है। एक अलग तरीका और अचानक परिणाम उस क्रम में नहीं निकलते हैं, जिसकी वे उम्मीद करते हैं। ये आम तौर पर वे लोग होते हैं जो डेटाबेस क्लास (या डॉक्यूमेंटेशन या ट्यूटोरियल्स को पढ़ते समय) पर ध्यान नहीं देते थे, जब उन्हें यह समझाया जाता था कि सामने वाले, कि क्वेरी के रिजल्ट की गारंटी नहीं है।


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

मुझे नहीं लगता कि वह चूक गया (हो सकता है कि वह संकेतन के साथ मैला था)। वह सेट से पहला तत्व नहीं चाहता है, वह सेट से एक मनमाना तत्व चाहता है। तुम उसे एक मनमाना तत्व दे सकते हैं के बाद से Setहै Iterable
एलाजार लीबोविच

आप सूचकांक द्वारा प्राप्त (इंडेक्स) के बारे में बात कर रहे हैं। समानता के द्वारा किसी वस्तु (वस्तु) के बारे में क्या?
कुमार मनीष

10

कुछ डेटा संरचनाएं मानक जावा संग्रह से गायब हैं।

बैग (सेट की तरह लेकिन कई बार तत्व हो सकते हैं)

यूनीकलिस्ट (सूचीबद्ध सूची, प्रत्येक तत्व को केवल एक बार शामिल कर सकता है)

लगता है कि आपको इस मामले में एक विशिष्ट व्यक्ति की आवश्यकता होगी

यदि आपको लचीली डेटा संरचनाओं की आवश्यकता है, तो आपको Google संग्रह में रुचि हो सकती है


1
क्या गुवा एक "यूनिकलिस्ट" प्रदान करता है?
माइक रायलैंडर

नहीं, लेकिन आपके पास एक java.util हो सकता है। लिंक्ड हैशसेट जिसमें समान गुण हैं।
एंड्रियास पीटरसन

7

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

लेकिन हमारे पास एक (ऑब्जेक्ट) विधि क्यों नहीं है, सूचकांक को पैरामीटर के रूप में प्रदान करके नहीं, बल्कि एक वस्तु जो हम खोज रहे हैं के बराबर है? इस तरह, हम सेट के अंदर तत्व के डेटा तक पहुँच सकते हैं, बस समान विधि द्वारा उपयोग किए गए इसके गुणों को जानकर।


7

यदि आप एक सेट में इंडेक्स द्वारा बहुत सारे यादृच्छिक एक्सेस करने जा रहे हैं, तो आप इसके तत्वों का एक सरणी दृश्य प्राप्त कर सकते हैं:

Object[] arrayView = mySet.toArray();
//do whatever you need with arrayView[i]

हालांकि दो मुख्य कमियां हैं:

  1. यह स्मृति कुशल नहीं है, क्योंकि पूरे सेट के लिए एक सरणी को बनाने की आवश्यकता है।
  2. यदि सेट को संशोधित किया जाता है, तो दृश्य अप्रचलित हो जाता है।

5

ऐसा इसलिए है क्योंकि सेट केवल विशिष्टता की गारंटी देता है, लेकिन इष्टतम पहुँच या उपयोग पैटर्न के बारे में कुछ नहीं कहता है। यानी, एक सेट एक सूची या एक मानचित्र हो सकता है, जिनमें से प्रत्येक में बहुत अलग पुनर्प्राप्ति विशेषताएं हैं।


5

एकमात्र कारण जो मैं एक सेट में संख्यात्मक सूचकांक का उपयोग करने के लिए सोच सकता हूं वह पुनरावृत्ति के लिए होगा। उसके लिए, का उपयोग करें

for(A a : set) { 
   visit(a); 
}

सच नहीं है, एक यादृच्छिक तत्व तक पहुंचने के बारे में क्या?
जेरेमी सलवेन

हा, हा। अच्छा बिंदु :) लेकिन इसका दुरुपयोग करने के लिए अत्यधिक संभावना होगी, मुझे यकीन है।
ह्यूगो

3

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

मुझे उन्हें प्रदर्शित करने के लिए अनुक्रमणिका के माध्यम से पहुंच की आवश्यकता थी और डुप्लिकेट को सफलतापूर्वक समाप्त करने के लिए सेट विशेषताएँ काम में आईं।

Java.util या Google संग्रह में कोई उपयुक्त संग्रह नहीं मिलने पर, मैंने इसे स्वयं कार्यान्वित करने के लिए सीधा पाया। मूल विचार एक SortedSet को लपेटना और एक सूची बनाना है जब सूचकांक के माध्यम से पहुंच आवश्यक होती है (और जब SortedSet को बदल दिया जाता है तो सूची को भूल जाते हैं)। यह निश्चित रूप से केवल कुशलता से काम करता है जब लिपटे हुए सॉर्टसेट को बदलना और संग्रह तक पहुंचने के लिए सूची को अलग करना। अन्यथा यह एक सूची की तरह व्यवहार करता है जिसे अक्सर हल किया जाता है, यानी बहुत धीमा।

बड़ी संख्या में बच्चों के साथ, इसने एक सूची में बहुत बेहतर प्रदर्शन किया, जिसे मैंने कलेक्शन.सॉर्ट के माध्यम से रखा।


2

कृपया ध्यान दें कि केवल 2 मूल डेटा संरचना को सूचकांक के माध्यम से पहुँचा जा सकता है।

  • ऑपरेशन O(1)को प्राप्त करने के लिए समय जटिलता के साथ सरणी डेटा संरचना को सूचकांक के माध्यम से एक्सेस किया जा सकता है get(int index)
  • लिंक्डलिस्ट डेटा संरचना को सूचकांक के माध्यम से भी एक्सेस किया जा सकता है, लेकिन ऑपरेशन O(n)को प्राप्त करने के लिए समय जटिलता के साथ get(int index)

जावा में, ऐरे डेटा संरचना ArrayListका उपयोग करके कार्यान्वित किया जाता है ।

हालांकि सेट डेटा संरचना को आमतौर पर हैशटेबल / हैशपेज या बैलेंस्डट्री डेटा संरचना के माध्यम से कार्यान्वित किया जा सकता है , तेजी से पता लगाने के लिए कि क्या कोई तत्व मौजूद है और गैर-मौजूदा तत्व जोड़ते हैं, आमतौर पर एक अच्छी तरह से लागू सेटO(1) समय जटिलता containsऑपरेशन प्राप्त कर सकता है । जावा में, सेटHashSet का सबसे आम उपयोग किया जाने वाला कार्यान्वयन है , इसे एपीआई कॉल करके कार्यान्वित किया जाता है, और लिंक किए गए सूचियों ( एरे और लिंक्डलिस्ट के संयोजन ) के साथ अलग-अलग चेनिंग का उपयोग करके लागू किया जाता है ।HashMapHashMap

चूंकि सेट को विभिन्न डेटा संरचना के माध्यम से लागू किया जा सकता है, इसलिए इसके लिए कोई get(int index)विधि नहीं है।


फ़िंगर ट्री (हास्केल का Data.Sequence.lookupकार्य देखें ) भी सूचकांक के माध्यम से पहुँचने की अनुमति देता है ( मध्य के पास O(1)सिरों के O(log n)पास, अधिक सटीक रूप से O(min(log(k), log(n-k)))), बाइनरी पेड़ भी करते हैं (हास्केल का Data.Set.lookupIndexकार्य देखें )। तो आपका प्रारंभिक दावा है कि "कृपया केवल 2 मूल डेटा संरचना को सूचकांक के माध्यम से एक्सेस किया जा सकता है" सही नहीं है।
अर्धविराम

1

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

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

// मुझे लगता है कि सेट इंटरफ़ेस में एक यादृच्छिक-तत्व था, हालांकि।


1

java.util.Setअन-ऑर्डर की गई वस्तुओं का एक संग्रह है। इसका कोई मतलब नहीं है अगर सेट के पास एक (इंट इंडेक्स) है, क्योंकि सेट में कोई इंडेक्स नहीं है और साथ ही आप केवल मूल्य का अनुमान लगा सकते हैं।

यदि आप वास्तव में ऐसा चाहते हैं, तो सेट से यादृच्छिक तत्व प्राप्त करने के लिए एक विधि को कोड करें।


0

तुम कर सकते हो new ArrayList<T>(set).get(index)


यह एक सेट की सूची देता है और एक सेट देता है। बल्कि, मैंने उपयोग किया: new ArrayList<T>(t).get(0) मुझे लगता है कि एक सूचकांक द्वारा सेट से एक विशेष तत्व प्राप्त करने के विचार का वैध विरोध है। लेकिन यह अच्छा होगा यदि सेट में केवल () सदस्य फ़ंक्शन होता है, जो कि आकार 1 के सेट के लिए, सेट में एकमात्र तत्व तक आसान पहुंच प्रदान करता है। इससे उपर्युक्त को बचाया जा सकेगा new ArrayListयाfor (Foo foo : foos) { return foo; }
डौग मॉस्कोप

0

यदि आपको सेट करने में कोई आपत्ति नहीं है तो आप अनुक्रमित-ट्री-मैप प्रोजेक्ट पर एक नज़र डालने के लिए इच्छुक हो सकते हैं ।

एन्हांस्ड ट्रीसेट / ट्रीपाउप इंडेक्स द्वारा तत्वों की पहुंच प्रदान करता है या किसी तत्व का इंडेक्स प्राप्त करता है। और कार्यान्वयन आरबी पेड़ में नोड वेट को अद्यतन करने पर आधारित है। तो कोई पुनरावृत्ति या यहाँ एक सूची से समर्थन नहीं है।


0

सेट एक इंटरफ़ेस है और इसके कार्यान्वयन वर्ग में से कुछ हैंशसेट, ट्रीसेट और लिंक्डहाशसेट। यह मानों को संग्रहीत करने के लिए हुड के नीचे हैशपॉप का उपयोग करता है। क्योंकि हाशप आदेश को संरक्षित नहीं करता है, इसलिए सूचकांक द्वारा मूल्य प्राप्त करना संभव नहीं है।

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

// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

सभी Setएस कार्यान्वयन HashMapहूड के तहत उपयोग कर रहे हैं मूल्यों को स्टोर करने के लिए आप उस दावे को प्रमाणित कर सकते हैं जिसके लिए दावा करते हैं TreeSet?
ग्रेबर्ड

1
the keys in the HashMap will have the same constant value HashMapवसीयत में चाबियाँ एक और एक ही अपरिवर्तनीयObject
ग्रेबियर


-3

एक सेट में तत्व प्राप्त करने के लिए, मैं निम्नलिखित का उपयोग करता हूं:

public T getElement(Set<T> set, T element) {
T result = null;
if (set instanceof TreeSet<?>) {
    T floor = ((TreeSet<T>) set).floor(element);
    if (floor != null && floor.equals(element))
    result = floor;
} else {
    boolean found = false;
    for (Iterator<T> it = set.iterator(); !found && it.hasNext();) {
    if (true) {
        T current = it.next();
        if (current.equals(element)) {
        result = current;
        found = true;
        }
    }
    }
}
return result;
}

फ़ंक्शन वह नहीं है जिसके लिए प्रश्न पूछा गया था। हमें सूचकांक की आवश्यकता है, न कि मूल्य की। वैसे भी आपका कार्य क्या है? ऐसा लगता है कि यह तत्व को वापस लौटाता है यदि यह भीतर एक तत्व के बराबर था। ऐसा क्या करता है जिसमें () नहीं है?
Janus Troelsen

Tपरिभाषित कहां है ? क्यों if (true)?
क्वांटम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.