मैं जावा में सूची में सेट की तरह कैसे करूँ?


169

जावा में, मेरे पास एक है Set, और मैं इसे एक हल में बदलना चाहता हूं List। क्या java.util.Collectionsपैकेज में कोई विधि है जो मेरे लिए ऐसा करेगी?

जवाबों:


214

ओपी द्वारा प्रदान किया गया उत्तर सबसे अच्छा नहीं है। यह अक्षम है, क्योंकि यह एक नया List और एक अनावश्यक नया सरणी बनाता है । इसके अलावा, यह जेनेरिक सरणियों के आसपास के प्रकार के सुरक्षा मुद्दों के कारण "अनियंत्रित" चेतावनी उठाता है।

इसके बजाय, कुछ इस तरह का उपयोग करें:

public static
<T extends Comparable<? super T>> List<T> asSortedList(Collection<T> c) {
  List<T> list = new ArrayList<T>(c);
  java.util.Collections.sort(list);
  return list;
}

यहाँ एक उदाहरण है:

Map<Integer, String> map = new HashMap<Integer, String>();
/* Add entries to the map. */
...
/* Now get a sorted list of the *values* in the map. */
Collection<String> unsorted = map.values();
List<String> sorted = Util.asSortedList(unsorted);

3
धन्यवाद! उस सप्रेसवर्निंग ने मुझे हमेशा परेशान किया।
जेरेमी स्टीन

4
@sunleo वह Utilवर्ग है जिसमें asSortedList()मेरे द्वारा लिखी गई विधि है। दूसरे शब्दों में, आप Utilस्वयं कक्षा लिखते हैं , और उस कोड को उसमें डालते हैं।
इरिकसन

1
हा हा मैंने सोचा कि डिफ़ॉल्ट पैक से जैसे java.util ठीक है धन्यवाद।
सूर्यदेव

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

1
केवल शीर्ष उत्तर पढ़ने वाले लोगों के लिए एक नोट के रूप में: नीचे nschum के उत्तर पर एक नजर डालें, जो जावा 8 की धाराओं का उपयोग करता है। यदि आप जावा 8 का उपयोग कर सकते हैं, तो इसके लिए जाएं। वे अधिक लचीले और कुशल हैं।
फाल्कन

74

क्रमबद्ध सेट:

return new TreeSet(setIWantSorted);

या:

return new ArrayList(new TreeSet(setIWantSorted));

यह मेरा पहला विचार था, लेकिन पूछने वाला एक सूची चाहता था
एलेक्स बी

@ एलेक्स: यह दृष्टिकोण अभी भी इस्तेमाल किया जा सकता है; नई ArrayList (नई TreeSet (setIWantSorted)) वापसी
Jonik

1
मैंने वास्तव में इस समाधान का उपयोग किया था, लेकिन मैं यह सलाह नहीं दूंगा। ट्रीसेट स्टेट्स पर प्रलेखन के रूप में ( डाउनलोड देखें .oracle.com/javase/1.4.2/docs/api/java/util/… ), यह प्रभावी रूप से समतुल्य () विधि के बजाय समतुल्य () विधि का उपयोग करता है - यदि आप सेट में दो ऑब्जेक्ट्स हैं जिनके समान समान () परिणाम हैं, उन्हें डुप्लिकेट के रूप में देखा जाएगा और, जैसे, ट्रीसेट में नहीं जोड़ा जाएगा। खबरदार।
fwielstra

24
@fwielstra: इनपुट के बराबर होने के बाद भी आपके पास कैसे ऑब्जेक्ट्स हो सकते हैं Set?
राणाप्रायोगो

2
@ryanprayogo यह उल्लेख के लायक है, क्योंकि एस new TreeSetस्वीकार करता है Collection, न कि सिर्फ Setएस। हर कोई जो इस उत्तर को नहीं पढ़ रहा है, वह एक का उपयोग करने जा रहा है Set, भले ही वह मूल प्रश्न पूछ रहा हो।
क्रिस

44
List myList = new ArrayList(collection);
Collections.sort(myList);

... हालांकि चाल करना चाहिए। जहां लागू हो वहां जेनरिक के साथ स्वाद जोड़ें।


मेरे पास एक उपयोगी स्निपेट था जिसे मैं समुदाय को दान करना चाहता था। जब मैंने जानकारी की तलाश की, तो मुझे नहीं मिला। मैं अगले व्यक्ति के काम को आसान बनाने की कोशिश कर रहा था। stackoverflow.com/questions/18557/…
जेरेमी स्टीन

1
हाँ, निश्चित रूप से, लेकिन आपके द्वारा प्रदान किया गया लिंक वास्तव में एक वास्तविक प्रश्न के बारे में बात कर रहा है (अर्थात जिनके लिए इसका उत्तर नहीं है, फिर उसे खोजें)। यहाँ आपका प्रश्न केवल उत्तर देने के लिए था ... मैं वास्तव में सैकड़ों प्रश्न दर्ज कर सकता था और स्वयं उत्तर दे सकता था; ये मुद्दा नहीं है!
सेब

5
@ सेब: मैं असहमत हूं। मुझे इस प्रश्न में कुछ भी गलत नहीं दिख रहा है। यह स्पष्ट रूप से एक बहुत ही सरल सवाल नहीं था, और अब वह पहले से बेहतर तरीका जानता है!
माइकल मायर्स

3
यह था एक असली सवाल है, लेकिन मैं इस सवाल का जवाब अपने आप को पाया के बाद गूगल कम आया। Stackoverflow समय पर मौजूद नहीं था। मैंने इसे अपनी वेबसाइट पर पोस्ट किया था और इसने किसी और की मदद की, इसलिए मुझे लगा कि यह यहाँ उपयोगी हो सकता है।
जेरेमी स्टीन

बोनस: और यदि आप अपने स्वयं के ऑब्जेक्ट प्रकार को क्रमबद्ध करते हैं तो आप हमेशा विधि को लागू Comparableऔर ओवरराइड कर सकते हैं compareTo
नाबस्टर

42

यहाँ आप इसे जावा 8 की धाराओं के साथ कैसे कर सकते हैं:

mySet.stream().sorted().collect(Collectors.toList());

या एक कस्टम तुलनित्र के साथ:

mySet.stream().sorted(myComparator).collect(Collectors.toList());

9

छँटाई कार्यान्वयन प्रदान करने के लिए हमेशा या तो तुलनात्मक या तुलनीय इंटरफ़ेस का उपयोग करना सुरक्षित होता है (यदि वस्तु आदिम डेटा प्रकारों के लिए स्ट्रिंग या आवरण कक्षाएं नहीं है)। नाम के आधार पर कर्मचारियों को छाँटने के लिए एक तुलनित्र कार्यान्वयन के लिए एक उदाहरण के रूप में

    List<Employees> empList = new LinkedList<Employees>(EmpSet);

    class EmployeeComparator implements Comparator<Employee> {

            public int compare(Employee e1, Employee e2) {
                return e1.getName().compareTo(e2.getName());
            }

        }

   Collections.sort(empList , new EmployeeComparator ());

तुलनित्र तब उपयोगी होता है जब आपको एक ही वस्तु पर अलग-अलग सॉर्टिंग एल्गोरिदम रखने की आवश्यकता होती है (जैसे नाम, साम्राज्य का वेतन, आदि)। आवश्यक मोड के लिए तुलनीय इंटरफ़ेस का उपयोग करके एकल मोड छँटाई को लागू किया जा सकता है।


5

ऐसा करने के लिए कोई एकल विधि नहीं है। इसे इस्तेमाल करो:

@SuppressWarnings("unchecked")
public static <T extends Comparable> List<T> asSortedList(Collection<T> collection) {
  T[] array = collection.toArray(
    (T[])new Comparable[collection.size()]);
  Arrays.sort(array);
  return Arrays.asList(array);
}

एक कलेक्शन.सोर्ट फंक्शन भी है, लेकिन मुझे लगता है कि यह वही काम करता है। +1 वैसे भी।
CookieOfFortune

1
संग्रह.सॉर्ट एक सूची को एक पैरामीटर के रूप में लेता है।
जेरेमी स्टीन

3

आप एक सेट को एक में बदल सकते हैं ArrayList, जहाँ आप ArrayListउपयोग को सॉर्ट कर सकते हैं Collections.sort(List)

यहाँ कोड है:

keySet = (Set) map.keySet();
ArrayList list = new ArrayList(keySet);     
Collections.sort(list);

3
TreeSet sortedset = new TreeSet();
sortedset.addAll(originalset);

list.addAll(sortedset);

जहाँ ओरिजिनलसेट = अनसर्टेड सेट और लिस्ट = वापस की जाने वाली सूची


ट्रीसेट भी उस सूची को डी-डुप कर देता है जिसके परिणामस्वरूप यदि आप ऐसा नहीं करते हैं तो गलत परिणाम हो सकता है।
अंथनामोनोरी

2

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

set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList());

0

मैं इस कोड का उपयोग कर रहा हूं, जो मुझे ऊपर दिए गए स्वीकृत उत्तर की तुलना में अधिक व्यावहारिक लगता है:

List<Thing> thingList = new ArrayList<>(thingSet);
thingList.sort((thing1, thing2) -> thing1.getName().compareToIgnoreCase(thing2.getName()));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.