2011-09-14 8 views
23

Duplicar posibles:
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?Clasificación int matriz en orden descendente

El siguiente código ordenar la matriz en ascendente orden:

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

Necesito ordenarlo en descendente orden. ¿Cómo uso Comparator para hacer esto?

Por favor ayuda.

+4

¿Es la tarea? –

+2

............... No – android

+0

Acabo de crear [una biblioteca para ordenar matrices primitivas con un comparador personalizado] (https://github.com/mintern-java/primitive#java- primitivo). El primer "uso de muestra" es ordenar un 'int []' en orden descendente. –

Respuesta

17

Para los tipos de matriz primitivos, que tendría que escribir un algoritmo de ordenación inversa:

Alternativamente, usted puede convertir su int[] a Integer[] y escribir un comparador:

public class IntegerComparator implements Comparator<Integer> { 

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

o utilizar Collections.reverseOrder() ya que sólo funciona en los tipos de matriz no primitivos.

y, finalmente,

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

error en convertPrimitiveArrayToBoxableTypeArray (a1) – android

+0

@android, ese método ** nunca ** existe, es un ejemplo que he creado para hacer la conversión de 'int []' a 'Entero []'. –

+0

Si convierto de int a Integer, entonces puedo usar Collections.reverseOrder pero tengo que volver a conversar a int.Is esta eficiente? Creo que es mejor invertir la matriz después de Aarrays.sort() luego de dos conversiones – android

5

Guava tiene un método Ints.asList() para crear un List<Integer> respaldado por una matriz int[]. Puede usar esto con Collections.sort para aplicar el Comparador a la matriz subyacente.

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

Tenga en cuenta que esta última es una lista en tiempo real respaldada por la matriz real, por lo que debería ser bastante eficiente.

+0

Sí. Lo sé. En realidad, quiero saber si hay alguna manera de usar Comparator. – android

+0

@android, no Comparador funciona en Objetos, no en primitivos. –

+0

@android ver mi actualización –

4

Si no es un gran conjunto de discos/tiempo sólo reflejarlo:

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

saber that.Actually quiero saber es que hay una manera de utilizar Comparador, – android

+0

No en primitivas. El comparador debe implementarse porque es una interfaz. –

+0

Gracias por la ayuda – 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

Gracias por la ayuda – android

Cuestiones relacionadas