2009-04-11 11 views

Odpowiedz

199

Odpowiedź provided by the OP nie jest najlepsza. Jest nieefektywny, ponieważ tworzy nową niepotrzebną macierz. Podnosi również "niezatwierdzone" ostrzeżenia z powodu problemów związanych z bezpieczeństwem typu wokół ogólnych tablic.

Zamiast używać coś takiego:

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

Oto przykład wykorzystania:

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

Dzięki! To pomijanie Ostrożności zawsze mi przeszkadzało. –

+0

@erickson, gdzie muszę znaleźć klasę Util, mam na myśli, z której paczki. Proszę mi pomóc. – sunleo

+4

@sunleo Klasa 'Util' jest tą, która zawiera metodę' asSortedList() ', którą napisałem. Innymi słowy, sam napiszesz klasę 'Util' i umieścisz w niej ten kod. – erickson

5

Nie ma jednej metody, aby to zrobić. Użyj tego:

@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

Istnieje również funkcja Collections.sort, ale myślę, że robi to samo.+1 i tak. – CookieOfFortune

+1

Collections.sort przyjmuje listę jako parametr. –

65

Sort zestaw:

return new TreeSet(setIWantSorted); 

czyli

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

To była moja pierwsza myśl, ale osoba pytająca chciała listę: –

+0

@Alex: To podejście może być nadal stosowane; return new ArrayList (new TreeSet (setIWantSorted)) – Jonik

+1

Użyłem tego rozwiązania, ale nie radziłbym tego. Ponieważ dokumentacja dotycząca stanów TreeSet (patrz http://download.oracle.com/javase/1.4.2/docs/api/java/util/TreeSet.html), efektywnie używa metody compareTo() zamiast równych () - więc jeśli masz dwa obiekty w zbiorze, które mają ten sam wynik równości(), będą one postrzegane jako duplikaty i jako takie nie zostaną dodane do zestawu TreeSet. Strzec się. – fwielstra

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

... powinno wystarczyć jednak. W razie potrzeby dodaj smaku z generics.

+0

Miałem użyteczny fragment, który chciałem przekazać społeczności. Kiedy szukałem informacji, nie mogłem tego znaleźć. Próbowałem ułatwić pracę następnej osobie. http://stackoverflow.com/questions/18557/how-does-stackoverflow-work-the-unofficial-faq#119658 –

+1

Tak, oczywiście, ale ten link, który podałeś, w rzeczywistości mówi o _rzeczywistych pytaniach (np. które nie mają odpowiedzi, a potem ją znajdź). Twoje pytanie tutaj miało tylko dać odpowiedź ... Mógłbym wprowadzić setki pytań i odpowiedzieć sobie; nie o to chodzi! – Seb

+5

@Seb: Nie zgadzam się. Nie widzę niczego złego w tym pytaniu. Oczywiście nie było to bardzo proste pytanie, a teraz zna on lepszy sposób niż wcześniej! –

3

można przekonwertować do zestawu z ArrayList, gdzie można sortować ArrayList użyciu Collections.sort(List).

Oto kod:

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

Czym różni się to od zaakceptowanej odpowiedzi? – Tim

8

Zawsze bezpiecznie użyć komparatora lub porównywalne interfejs w celu zapewnienia realizacji sortowania (jeśli obiekt nie jest String lub klasy otoki dla prymitywnych typów danych). Jako przykład implementacja komparator do sortowania pracowników na podstawie nazwy

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

Komparator jest przydatna, gdy trzeba mieć inny algorytm sortowania na tym samym obiekcie (Say nazwa EMP, EMP wynagrodzenie, itp). Sortowanie w jednym trybie można zaimplementować za pomocą porównywalnego interfejsu do wymaganego obiektu.

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

list.addAll(sortedset); 

gdzie originalset = zestaw sortowania i list = lista zostać zwrócone

32

Oto jak można to zrobić z Java 8 za Streams:

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

lub z niestandardowym komparatora:

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

@Jeremy Stein Chciałem zaimplementować ten sam kod. Poza tym chciałem posortować zestaw do listy, więc zamiast używać Seta przekonwertowałem zestaw wartości na Listę i posortuję tę listę, ponieważ jest to jedna z nich. Ten kod pomógł mi,

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