2010-11-12 20 views
36

Ich versuche Elemente eines Satzes zu sortieren, aber bisher nicht zu tun. hier ist mein Code, die ichSortieren der Werte von Set

public static void main(String [] args){ 
    Set<String> set=new HashSet<String>(); 
    set.add("12"); 
    set.add("15"); 
    set.add("5"); 
    List<String> list=asSortedList(set); 
} 

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

aber diese oder andere Art und Weise, da seine ganze Zeit nicht funktioniert zu tun versuche, mir die gleiche Reihenfolge geben, in dem sie gefüllt wurden 12,15,5

+5

Eine 'Map' ist kein' Set'. Großer Unterschied! –

+3

Gibt es einen Grund, warum Sie SortedSet nicht verwendet haben, wenn Sie einen sortierten Satz wünschen? –

Antwort

27

Wenn Sie die Strings "12", "15" und "5" sortieren, dann kommt "5" zuletzt, weil "5">"1". die natürliche Reihenfolge von Strings funktioniert nicht so, wie Sie es erwarten.

Wenn Sie Strings in Ihrer Liste speichern möchten, diese aber numerisch sortieren möchten, müssen Sie einen Komparator verwenden, der dies behandelt. z.B.

Collections.sort(list, new Comparator<String>() { 
    public int compare(String o1, String o2) { 
     Integer i1 = Integer.parseInt(o1); 
     Integer i2 = Integer.parseInt(o2); 
     return (i1 > i2 ? -1 : (i1 == i2 ? 0 : 1)); 
    } 
}); 

Auch ich glaube, Sie werden immer zwischen Collection Typen leicht gemischt. A HashSet und HashMap sind verschiedene Dinge.

+0

+1 ... obwohl: Das Subtrahieren eines int von einem anderen während des Vergleichs kann zum Unterlauf führen; Ein expliziter Vergleich wäre sicherer. – Adamski

+0

@Adamski Danke, habe die 'compare' Methode – mikej

+0

überarbeitet' o1 == o2' kann zu unerwarteten Ergebnissen mit nicht-internierten Strings führen. Verwende 'o1.equals (o2)' (du könntest auch 'o1.intern() == o2.intern()' machen, aber das ist schrecklich) –

0

Sie müssen eine Comparator-Instanz an die Sortiermethode übergeben, da andernfalls die Elemente in ihrer natürlichen Reihenfolge sortiert werden.

Weitere Informationen erhalten Sie Collections.sort(List, Comparator)

5

Sie den Standard-Komparator mit einem Set<String> zu sortieren. In diesem Fall bedeutet das lexicographic order. Lexikographisch, "12" kommt vor "15", kommt vor "5".

verwenden entweder eine Set<Integer>:

Set<Integer> set=new HashSet<Integer>(); 
set.add(12); 
set.add(15); 
set.add(5); 

Oder einen anderen Komparator verwenden:

Collections.sort(list, new Comparator<String>() { 
    public int compare(String a, String b) { 
     return Integer.parseInt(a) - Integer.parseInt(b); 
    } 
}); 
54

Verwenden Sie ein SortedSet (TreeSet wird standardmäßig):

SortedSet<String> set=new TreeSet<String>(); 
set.add("12"); 
set.add("15"); 
set.add("5"); 
List<String> list=new ArrayList<String>(set); 

Kein zusätzlicher Sortiercode benötigt.

Oh, ich sehe Sie wollen eine andere Sortierreihenfolge.Geben Sie einen Komparator zum TreeSet:

new TreeSet<String>(Comparator.comparing(Integer::valueOf)); 

Jetzt ist Ihr TreeSet Strings in numerischer Reihenfolge sortiert werden (was bedeutet, dass es Ausnahmen auslösen, wenn Sie nicht-numerische Strings liefern)

Referenz:

+0

Sie können diesen 'Comparator' auch an den Konstruktor von' TreeSet' übergeben – NamshubWriter

4

Verwenden Sie die Integer Wrapper-Klasse statt String, weil es die harte Arbeit für Sie durch die Implementierung Comparable<Integer> tut. Dann würde java.util.Collections.sort(list); den Trick tun.

Verwandte Themen