जावा सेट बरकरार रखने का आदेश?


179

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


3
"तत्वों को किसी विशेष क्रम में वापस नहीं किया जाता है (जब तक कि यह सेट कुछ वर्ग का एक उदाहरण है जो गारंटी प्रदान करता है)।" सेट के लिए पुनरावृत्ति विधि क्या है। यहाँ
कीसर

जवाबों:


256

Setइंटरफेस किसी भी आदेश देने की गारंटी देता है प्रदान नहीं करता है।

इसका उप-इंटरफ़ेस SortedSetएक सेट का प्रतिनिधित्व करता है जिसे कुछ मानदंड के अनुसार क्रमबद्ध किया जाता है। जावा 6 में, दो मानक कंटेनर हैं जो लागू होते हैं SortedSet। वे हैं TreeSetऔर ConcurrentSkipListSet

SortedSetइंटरफेस के अलावा , LinkedHashSetक्लास भी है । यह उस क्रम को याद करता है जिसमें तत्वों को सेट में डाला गया था, और उस क्रम में अपने तत्वों को वापस करता है।


21
इसके अलावा, जावा 8 में अलग-अलग स्ट्रिंग हैशिंग के कारण, सेट्स और मैप्स में डिफॉल्ट (अनसोल्ड) ऑर्डरिंग बदल जाएगी। यदि आप
अनसोल्ड

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

@White_King: एक सेट एक गणितीय अवधारणा है जिसमें "सम्मिलन क्रम" की धारणा शामिल नहीं है, इसलिए यह जावा इंटरफेस के लिए अपने सम्मेलनों का पालन करने के लिए समझ में आता है। ऑर्डर किए गए सेट हैं, लेकिन ऑर्डर एक रिलेशन (जावा में तुलनित्र) द्वारा निर्दिष्ट किया गया है, फिर से जावा में परिभाषा के साथ सेट सिद्धांत में परिभाषा का मिलान किया जाता है। प्रविष्टि आदेश रखने के बारे में आपकी उम्मीद शायद सूचियों से आती है लेकिन सेट सूची नहीं हैं।
कोनराड हॉफनर

103

LinkedHashSet की आपको आवश्यकता है।


43
Listनहीं है Set(यह सदस्यता की विशिष्टता की गारंटी नहीं देता है)।
सीमित प्रायश्चित

10
कई व्यावसायिक विशिष्ट मामलों में सूची का उपयोग केवल सेट के बजाय ऑर्डर को बनाए रखने के लिए नहीं किया जा सकता है। लिंक्डहाशसेट ऑर्डर और स्टोर्स को अद्वितीय बनाए रखता है।
जूल

18

जैसा कि कई सदस्यों ने सुझाव दिया कि LinkedHashSet का उपयोग करें कि संग्रह के क्रम को बनाए रखने के का । यू इस कार्यान्वयन का उपयोग करके अपने सेट को लपेट सकते हैं।

SortedSet कार्यान्वयन सॉर्ट किए गए आदेश के लिए उपयोग किया जा सकता है लेकिन आपके उद्देश्य के लिए LinkedHashSet का उपयोग करें

डॉक्स से भी,

"यह कार्यान्वयन अपने ग्राहकों को ट्रीसेट के साथ जुड़े लागत को बढ़ाए बिना, हैशसेट द्वारा प्रदान किए गए आमतौर पर अराजक आदेश से प्रेरित करता है। इसका उपयोग मूल की परवाह किए बिना, एक सेट की एक प्रति उत्पन्न करने के लिए किया जा सकता है। सेट का कार्यान्वयन: "

स्रोत: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html


9

सेट सिर्फ एक इंटरफेस है। आदेश को बनाए रखने के लिए, आपको उस इंटरफ़ेस और उप-इंटरफ़ेस SortedSet के एक विशिष्ट कार्यान्वयन का उपयोग करना होगा, उदाहरण के लिए TreeSet या LinkedHashSet। आप अपने सेट को इस तरह से लपेट सकते हैं:

Set myOrderedSet = new LinkedHashSet(mySet);

7

यहाँ Setजावा में उपलब्ध मानक कार्यान्वयन के आदेश विशेषताओं का त्वरित सारांश दिया गया है:

  1. प्रविष्टि क्रम रखें: LinkedHashSet और CopyOnWriteArraySet (थ्रेड-सेफ़)
  2. : आइटम सेट के भीतर हल कर रख TreeSet , EnumSet (enums के लिए विशिष्ट) और ConcurrentSkipListSet (धागा सुरक्षित)
  3. आइटमों को किसी विशेष क्रम में नहीं रखते हैं: हैशसेट (आपके द्वारा कोशिश की गई)

अपने विशिष्ट मामले के लिए, आप या तो पहले आइटम को सॉर्ट कर सकते हैं और फिर 1 या 2 (सबसे अधिक संभावना LinkedHashSetया TreeSet) में से किसी का उपयोग कर सकते हैं । या वैकल्पिक रूप से और अधिक कुशलता से , आप बस बिना डेटा को जोड़ सकते हैं TreeSetजो आपके लिए स्वचालित रूप से छंटाई का ध्यान रखेगा।


7

आदेश का उपयोग Listया ए को बनाए रखने के लिए LinkedHashSet


1
यह LinkedHashSet... नहीं Map
मार्को टोपोलनिक

मुझे एक सेट नहीं एक सूची की आवश्यकता है, मुझे एक सेट की आवश्यकता है जो ALSO उन वस्तुओं के इंजेक्शन के क्रम को बनाए रखता है जो मुझे लगता है
व्हाइट_किग

5

LinkedHashSet, HashSet का एक ऑर्डर किया गया संस्करण है, जो सभी तत्वों में एक डबल-लिंक्ड सूची रखता है। जब आप पुनरावृति क्रम की परवाह करते हैं, तो हैशसेट के बजाय इस वर्ग का उपयोग करें।


3

के लिए javadoc से Set.iterator():

इस सेट में तत्वों पर एक पुनरावृत्ति देता है। तत्वों को किसी विशेष क्रम में वापस नहीं किया जाता है (जब तक कि यह सेट कुछ वर्ग का एक उदाहरण है जो गारंटी प्रदान करता है)।

और, जैसा कि पहले ही शूचैन द्वारा कहा गया है , एक TreeSetका कार्यान्वयन Setएक गारंटीकृत आदेश है:

तत्वों को उनके प्राकृतिक ऑर्डरिंग का उपयोग करने का आदेश दिया जाता है, या सेट निर्माण समय पर प्रदान किए गए एक तुलनित्र द्वारा, जिसके आधार पर कंस्ट्रक्टर का उपयोग किया जाता है।


3

आम तौर पर सेट ऑर्डर नहीं रखता है, जैसे कि हाशसेट को जल्दी से एक प्रतिष्ठित खोजने के लिए, लेकिन आप कोशिश कर सकते हैं LinkedHashSet यह आपके द्वारा रखे गए आदेश को रखेगा।


1

2 अलग-अलग चीजें हैं।

  1. तत्वों को एक सेट में क्रमबद्ध करें। जिसके लिए हमारे पास SortedSet और समान कार्यान्वयन हैं।
  2. एक सेट में प्रविष्टि क्रम बनाए रखें। जिसके लिए LinkedHashSet और CopyOnWriteArraySet (थ्रेड-सेफ) का उपयोग किया जा सकता है।



-2

केवल SortedSetआदेश दे सकते हैंSet


प्रश्न सम्मिलन क्रम को बनाए रखने के बारे में है (जो सॉर्ट किया जाना है)।
assylias
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.