2009-04-11 4 views

Antwort

199

Die Antwort provided by the OP ist nicht die beste. Es ist ineffizient, da es eine neue Listund ein unnötiges neues Array erstellt. Außerdem werden aufgrund der Typsicherheitsprobleme um generische Arrays "ungeprüfte" Warnungen ausgelöst.

Verwenden Sie stattdessen etwas wie folgt aus:

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

Hier ist ein Anwendungsbeispiel:

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

Danke! Dass Unterdrücken mich immer belästigte. –

+0

@erickson wo ich Util Klasse finden muss, ich meine aus welchem ​​Paket.Bitte helfen Sie mir. – sunleo

+4

@sunleo Die 'Util' Klasse ist diejenige, die die' asSortedList() 'Methode enthält, die ich geschrieben habe. Mit anderen Worten, Sie schreiben selbst die 'Util'-Klasse und schreiben diesen Code hinein. – erickson

5

Es gibt keine einzige Methode, das zu tun. Verwenden Sie diese Option:

@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

Es gibt auch eine Collections.sort Funktion, aber ich denke, es ist die gleiche Sache tut.+1 sowieso. – CookieOfFortune

+1

Collections.sort nimmt eine Liste als Parameter. –

65

Sortiert Satz:

return new TreeSet(setIWantSorted); 

oder:

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

Das war mein erster Gedanke, aber der Fragesteller wollte eine Liste –

+0

@Alex: Dieser Ansatz kann immer noch verwendet werden; return new ArrayList (neues TreeSet (setIWantSorted)) – Jonik

+1

Ich habe diese Lösung tatsächlich benutzt, aber ich würde das nicht empfehlen. Wie die Dokumentation zu TreeSet -Status (siehe http://download.oracle.com/javase/1.4.2/docs/api/java/util/TreeSet.html) enthält, verwendet sie effektiv die compareTo() -Methode anstelle des equals () Methode - Wenn Sie also zwei Objekte in der Menge haben, die das gleiche Ergebnis von equals() haben, werden sie als Duplikate betrachtet und als solche nicht zum TreeSet hinzugefügt. In acht nehmen. – fwielstra

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

... sollte aber den Trick. Fügen Sie Geschmack mit Generika hinzu, wo zutreffend.

+0

Ich hatte einen nützlichen Ausschnitt, den ich der Community spenden wollte. Als ich nach den Informationen suchte, konnte ich sie nicht finden. Ich habe versucht, die Arbeit der nächsten Person zu erleichtern. http://StackOverflow.com/Questions/18557/How-does-StackOverflow-Work-the-unofficial-faq#119658 –

+1

Ja, sicher, aber dieser Link, den Sie zur Verfügung gestellt werden, spricht tatsächlich über eine _real_ Fragen (dh diejenigen für die die Antwort nicht haben, dann finde sie). Deine Frage hier war nur, um die Antwort zu geben ... Ich könnte tatsächlich Hunderte von Fragen eingeben und selbst antworten; das ist nicht der Punkt! – Seb

+5

@Seb: Ich stimme nicht zu. Ich sehe mit dieser Frage nichts falsch. Es war offensichtlich keine sehr einfache Frage, und jetzt weiß er einen besseren Weg als zuvor! –

3

Sie einen Satz in eine ArrayList umwandeln kann, in dem Sie die ArrayList mit Collections.sort(List) sortieren. Hier

ist der Code:

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

Wie unterscheidet sich das von der angenommenen Antwort? – Tim

8

Immer sicher entweder Vergleicher oder vergleichbare Schnittstelle verwenden Implementierung bereitzustellen Sortierung (wenn das Objekt kein String oder Wrapper-Klassen für primitive Datentypen). Als Beispiel für eine Implementierung Komparator Mitarbeiter auf Namen zu sortieren

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

Vergleicher sind nützlich, wenn Sie verschiedenen Sortieralgorithmus auf demselben Objekt (Say emp Name, emp Gehalt, usw.) haben müssen. Single-Mode-Sortierung kann implementiert werden, indem vergleichbare Schnittstelle in das erforderliche Objekt verwendet wird.

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

list.addAll(sortedset); 

wo originalset = unsortierten Satz und list = die Liste

32

Hier zurückgegeben werden, wie Sie es mit Java 8 des Streams tun können:

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

oder mit einem benutzerdefinierten Komparator:

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

@ Jeremy Stein Ich wollte den gleichen Code implementieren. Außerdem wollte ich das Set in eine Liste sortieren, also setze ich set nicht in Set, sondern in List und sortiere diese Liste nach der Variablen. Dieser Code hat mir geholfen,

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