2013-07-14 9 views
24

Wygląda na to, że nie jest to udokumentowane lub przegapiłem.Jaka jest kolejność sortowania kolekcji Collections.sort Java (lista, komparator)? małe do dużych czy duże do małych?

Here „s link do dokumentacji i poniżej znajduje się tekst jako obraz:

EDIT (17/5): Myślę, że zbyt wiele mylić to pytanie za pytanie komparator. Nie jest. Komparator porównuje 2 elementy. Zgodnie z tym porównaniem lista została posortowana. Jak? Rosnąco czy Malejąco?

będę udoskonalenie/uprościć pytanie jeszcze: Jeśli zdecyduje, że elementem porównawczym A jest mniejsza niż elementu B. Na liście posortowanej, będzie elementem A będzie usytuowany przy mniejszym niż indeks elementu B?

enter image description here

+2

To zależy od tego jak masz napisane ' Komparator "? – sanbhat

+0

Czy zapoznałeś się z API "Komparatora"? Pozwala zdefiniować własną kolejność sortowania. –

+0

Proszę spojrzeć na moją edycję od 15/7. –

Odpowiedz

22

kolejność sortowania jest zawsze rosnąco, gdzie komparatora określa, które elementy są większe niż inne.

Z dokumentacji dla Collections.sort(List<T> list, Comparator<? super T> c):

Sortuje podanej listy według kolejności podanej wywołanego przez komparator.

Z dokumentacji dla Comparator.compare(T,T):

porównuje swoje dwa argumenty na zamówienie. Zwraca ujemną liczbę całkowitą, zero lub dodatnią liczbę całkowitą, ponieważ pierwszy argument jest mniejszy, równy lub większy od drugiego.

+2

Dlaczego według Ciebie posortowana lista jest rosnąco? –

+3

Obserwacja. Po wywołaniu metody lista jest uporządkowana od najmniejszego do największego, zgodnie z definicją dostarczoną przez komparator. Przed obserwacją, odgadłbym, rosnącą kolejność równoległości z rodzeństwem metody Collections.sort (List ), która * jest * jawnie udokumentowana jako rosnąca. Dokumentacja metody, z której korzystasz, zostałaby poprawiona poprzez wyraźne wymienienie kolejności rosnącej, podobnie jak jej rodzeństwo. –

19

Ty (lub raczej, twój porównawczym) decyduje.

  • Jeśli Comparator „s compare(T o1, T o2) powrócić negatywne kiedy o1 jest mniej niż o2, otrzymasz zamówienie (demo on ideone) rosnąco.
  • Jeśli twój Comparator 's compare(T o1, T o2) zwróci wartość ujemną, gdy o1 jest większa niż o2, otrzymasz kolejność malejącą (demo on ideone).

Innym sposobem mówiąc samo byłoby, że sort zakłada, że ​​komparator zamawia dwa przedmioty przekazane do niego z mniejszym (o1) do wartości (o2) i wytwarza rosnąco Sortuj spójne z tym zamawiającego.

+4

Innym sposobem patrzenia na to, bardziej zgodnym z umową Komparator, jest to, że Komparator określa, które elementy są mniejsze, równe lub większe od innych. –

+0

Czy drugie zdanie nie powinno "zwracać wartości dodatniej, gdy o1 jest mniejsze niż o2"? W przeciwnym razie byłby to ten sam sposób, jak w pierwszym zdaniu. – nif

+0

@nif Masz rację, powinienem "odwrócić" jedną część warunku, a nie obie. Dzięki! – dasblinkenlight

2

Dokumentacja Comparator.compareTo(o1, o2) metody mówi

porównuje swoje dwa argumenty na zamówienie. Zwraca ujemną liczbę całkowitą, zero lub dodatnią liczbę całkowitą, ponieważ pierwszy argument jest mniejszy niż, równy lub większy niż drugi.

Więc jeśli chcesz posortować z naturalnej kolejności, czyli małych do dużych, to należy napisać realizacji, jak określono w dokumentacji

public int compareTo(Integer o1, Integer o2) { 
    int v1 = (o1); 
    int v2 = (o2); 
    if(v1 == v2) { 
     return 0; 
    } 
    if(v1 < v2) { 
     return -1; //return negative integer if first argument is less than second 
    } 
    return 1; 
} 

Jeśli chcesz sortowania być w odwrotnej kolejności , że jest duża do małej

public int compareTo(Integer o1, Integer o2) { 
    int v1 = (o1); 
    int v2 = (o2); 
    if(v1 == v2) { 
     return 0; 
    } 
    if(v1 < v2) { 
     return 1; //do the other way 
    } 
    return -1; 
} 
0

Według dokumentacji https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort(java.util.List,%20java.util.Comparator, realizacja sortowania Collections.sort (lista, komparator) jest mergesort.

Biorąc pod uwagę, że wynik uzyskany przez MergeSort rośnie (https://en.wikipedia.org/wiki/Merge_sort), kolejność sortowania Collections.sort (lista, komparator) jest rosnąca.

To znaczy, jeśli uzna, że ​​elementem porównawczym A jest mniejsza niż elementu B. Na liście posortowanej, element A będzie znajdować się w mniejszym niż indeks elementu B.