2009-04-11 4 views

उत्तर

199

उत्तर provided by the OP सबसे अच्छा नहीं है। यह अक्षम है, क्योंकि यह एक नया Listऔर एक अनावश्यक नई सरणी बनाता है। इसके अलावा, यह जेनेरिक सरणी के आसपास प्रकार के सुरक्षा मुद्दों के कारण "अनचेक" चेतावनियां उठाता है। आप एक ArrayList है, जहां आप ArrayListCollections.sort(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); 
+2

धन्यवाद! वह SuppressWarnings हमेशा मुझे परेशान किया। –

+0

@ एरिक्सन जहां मुझे कक्षा कक्षा मिलनी है, मेरा मतलब है कि कौन सा पैकेज। कृपया मेरी मदद करें। – sunleo

+4

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

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); 
} 
+0

संग्रह संग्रह भी है, लेकिन मुझे लगता है कि यह वही काम करता है।वैसे भी +1। – CookieOfFortune

+1

संग्रह .sort एक पैरामीटर के रूप में एक सूची लेता है। –

65

छाँटे गए सेट:

return new TreeSet(setIWantSorted); 

या:

return new ArrayList(new TreeSet(setIWantSorted)); 
+0

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

+0

@Alex: इस दृष्टिकोण का अभी भी उपयोग किया जा सकता है; नई ArrayList (नया ट्रीसेट (setIWantSorted) लौटें) – Jonik

+1

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

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

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

+0

मेरे पास एक उपयोगी स्निपेट था जिसे मैं समुदाय को दान करना चाहता था। जब मैंने सूचना की खोज की, तो मुझे यह नहीं मिला। मैं अगले व्यक्ति की नौकरी को आसान बनाने की कोशिश कर रहा था। http://stackoverflow.com/questions/18557/how-does-stackoverflow-work-the-unofficial-faq#119658 –

+1

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

+5

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

3

:

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; 
} 

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

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

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

यह स्वीकृत उत्तर से अलग कैसे है? – Tim

8

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

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

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()); 

तुलनाकारी उपयोगी है एक उदाहरण के रूप। एकल ऑब्जेक्ट सॉर्टिंग को आवश्यक ऑब्जेक्ट में तुलनात्मक इंटरफ़ेस का उपयोग करके कार्यान्वित किया जा सकता है।

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

list.addAll(sortedset); 

जहां originalset = अवर्गीकृत सेट और सूची = सूची

32

यहाँ लौटा दी करने के लिए कैसे आप जावा 8 के स्ट्रीम के साथ यह क्या कर सकते हैं:

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

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

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

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

set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList()); 
संबंधित मुद्दे