2011-09-14 10 views
23

Powiel możliwe:
Sort arrays of primitive types in descending order
Java : How to sort an array of floats in reverse order?
How do I reverse an int array in Java?Sortowanie int tablica w kolejności malejącej

Poniższy kod sortuje tablicę w rosnąco zamówienie:

int a[] = {30,7,9,20}; 
Arrays.sort(a); 
System.out.println(Arrays.toString(a)); 

Muszę posortować w kolejności malejąco zamówienia. W jaki sposób mogę użyć Komparatora, aby to zrobić?

Proszę o pomoc.

+4

Czy praca domowa? –

+2

............... Nr – android

+0

Właśnie utworzyłem [bibliotekę do sortowania prymitywnych tablic z niestandardowym komparatorem] (https://github.com/mintern-java/primitive#java- prymitywny). Pierwszym "użyciem próbki" jest sortowanie 'int []' w porządku malejącym. –

Odpowiedz

17

Dla prymitywnych typów tablicowych, trzeba by napisać odwrotnego algorytmu sortowania:

Alternatywnie, można konwertować int[] do Integer[] i napisać komparatora:

public class IntegerComparator implements Comparator<Integer> { 

    @Override 
    public int compare(Integer o1, Integer o2) { 
     return o2.compareTo(o1); 
    } 
} 

lub użyj Collections.reverseOrder() ponieważ działa tylko na non-prymitywnych typów tablicowych.

wreszcie

Integer[] a2 = convertPrimitiveArrayToBoxableTypeArray(a1); 
Arrays.sort(a2, new IntegerComparator()); // OR 
// Arrays.sort(a2, Collections.reverseOrder()); 

//Unbox the array to primitive type 
a1 = convertBoxableTypeArrayToPrimitiveTypeArray(a2); 
+0

błąd w convertPrimitiveArrayToBoxableTypeArray (a1) – android

+0

@android, ta metoda ** nigdy ** istnieje, jest to przykład, który stworzyłem, aby wykonać konwersję z 'int []' na 'Integer []'. –

+0

Jeśli konwertuję z int na Integer, to mogę użyć Collections.reverseOrder, ale muszę przekonwertować ponownie do int. Czy to jest wydajne? Myślę, że lepiej po prostu odwrócić tablicę po Aarrays.sort(), a następnie dwie konwersje – android

5

Guava ma metodę Ints.asList() do tworzenia List<Integer> wspieraną przez macierz int[]. Możesz użyć tego w Collections.sort, aby zastosować Komparator do podstawowej tablicy.

List<Integer> integersList = Ints.asList(arr); 
Collections.sort(integersList, Collections.reverseOrder()); 

Należy zauważyć, że ta ostatnia jest żywą listą wspieraną przez rzeczywistą tablicę, więc powinna być całkiem wydajna.

+0

Tak. Wiem. Pragnę wiedzieć, czy istnieje sposób na użycie Komparatora. – android

+0

@android, no Comparator działa na obiektach, nie na prymitywach. –

+0

@android patrz moja zmiana –

4

Jeśli to nie jest duża/długa tablica tylko lustro go:

for(int i = 0; i < arr.length/2; ++i) 
{ 
    temp = arr[i]; 
    arr[i] = arr[arr.length - i - 1]; 
    arr[arr.length - i - 1] = temp; 
} 
+2

Yes.I wiedzieć that.Actually chcę wiedzieć, czy jest jakiś sposób, aby wykorzystać Komparator, – android

+0

Nie na elementach pierwotnych. Komparator musi zostać wdrożony, ponieważ jest interfejsem. –

+0

Dzięki za pomoc – android

5
Comparator<Integer> comparator = new Comparator<Integer>() { 

     @Override 
     public int compare(Integer o1, Integer o2) { 
      return o2.compareTo(o1); 
     } 
    }; 

    // option 1 
    Integer[] array = new Integer[] { 1, 24, 4, 4, 345 }; 
    Arrays.sort(array, comparator); 

    // option 2 
    int[] array2 = new int[] { 1, 24, 4, 4, 345 }; 
    List<Integer>list = Ints.asList(array2); 
    Collections.sort(list, comparator); 
    array2 = Ints.toArray(list); 
+0

Dzięki za pomoc – android

Powiązane problemy