2011-10-29 22 views
5

Tengo una matriz 2D que quiero ordenar según la segunda columna. La primera columna debe permanecer emparejada con la segunda columna.Ordenar una matriz de enteros 2D basada en una columna

El 2D-array es inicialmente como sigue (2x10 matriz):

0 10 
1 9 
2 9 
3 9 
4 15 
5 10 
6 4 
7 8 
8 11 
9 12 

Quiero lo anterior 2D-array a clasificar como esto:

4 15 
9 12 
8 11 
0 10 
5 10 
1 9 
2 9 
3 9 
7 8 
6 4 

Ahora, he intentado la adaptación de la respuesta de: Sort a two dimensional array based on one column en este código:

Arrays.sort(theArray, new Comparator<Integer[]>() 
{ 
    @Override 
    public int compare(Integer[] int1, Integer[] int2) 
    { 
     Integer numOfKeys1 = int1[1]; 
     Integer numOfKeys2 = int2[1]; 
     return numOfKeys1.compareTo(numOfKeys2); 
    } 
}); 

sin embargo, no parece para ordenar la matriz en absoluto. Al imprimir la matriz después de llamar a la función sort() la matriz está en su orden inicial.

También intenté adaptar la respuesta desde aquí: sorting 2D array of String in java pero me encontré con el mismo problema.

¿He cometido algún error fatal al adaptar estas soluciones, o debería funcionar mi código?

Además, ¿cómo haré para ordenar esta matriz en orden descendente? ¿Reemplazaría la declaración de devolución en compare() con esta línea?

return -numOfKeys2.compareTo(numOfKeys1); 

Cualquier ayuda sería muy apreciada. ¡Gracias!

EDITAR: Solo publico el resto de mi código para ver si el problema está en otra parte.

public void Sort() 
{ 
    Integer[][] theArray = {{0,10},{1,9},{2,9},{3,9},{4,15},{5,10},{6,4},{7,8},{8,11},{9,12}};; 

    dump(theArray); 
    Arrays.sort(theArray, new Comparator<Integer[]>() 
    { 
     @Override 
     public int compare(Integer[] int1, Integer[] int2) 
     { 
      Integer numOfKeys1 = int1[1]; 
      Integer numOfKeys2 = int2[1]; 
      return numOfKeys1.compareTo(numOfKeys2); 
     } 
    }); 

    System.out.println("===="); 
    dump(theArray);  
} 

public void dump(Integer[][] array) 
{ 
    for(int p = 0, q = 10; p < q; p++) 
    { 
     System.out.println(array[p][0] + " " + array[p][1]); 
    } 
} 

EDIT 2:

Tengo que trabajar. Gracias a todos por su ayuda. Tenía varias funciones de Sort() (una más antigua que no funcionaba, y la que ve arriba), y resulta que estaba llamando a la incorrecta, a pesar de que pensé que había cambiado la llamada. Solo uno de esos dias.

Siéntase libre de utilizar el código de arriba si desea ordenar una matriz. Está funcionando completamente ahora.

+0

Ese código no debería ejecutarse; la matriz de matrices tiene una única matriz con un conjunto de matrices de dos elementos, la trata como una matriz de dos matrices de diez elementos cuando la imprime. –

+0

Tienes razón, estaba confundiendo mis índices. Gracias por corregirme. Y gracias por tu ayuda. – Drake

Respuesta

1

Funciona bien para mí. Para revertir el orden, anularía el original compareTo, o intercambiando las variables, pero no ambas.

Probablemente necesitemos ver el resto del código para entender por qué está viendo lo que está viendo; Corté y pegué tu código textualmente, así que las probabilidades son buenas, el problema está en otro lado.


dump(theArray); 
Arrays.sort(theArray, new Comparator<Integer[]>() { 
    public int compare(Integer[] int1, Integer[] int2) { 
     Integer numOfKeys1 = int1[1]; 
     Integer numOfKeys2 = int2[1]; 
     return numOfKeys1.compareTo(numOfKeys2); 
    } 
}); 
System.out.println("================"); 
dump(theArray); 


0 10 
0 10 
1 9 
2 9 
3 9 
4 15 
5 10 
6 4 
7 8 
8 11 
9 12 
================ 
6 4 
7 8 
1 9 
2 9 
3 9 
0 10 
0 10 
5 10 
8 11 
9 12 
4 15 
+0

Gracias por probar mi función sort(). Publicaré el resto de mi código ahora. – Drake

+0

Buena explicación. – gurubelli

1

Código funciona para mí también. Perdón por el código desordenado, tuve que hacer una prueba rápida. ¡Saludos!

import java.util.*; 

class arraysort { 

    public static Integer[][] mysort(Integer[][] ar) { 
     Arrays.sort(ar, new Comparator<Integer[]>() { 
      @Override 
      public int compare(Integer[] int1, Integer[] int2) { 
       Integer numOfKeys1 = int1[1]; 
       Integer numOfKeys2 = int2[1]; 
       return numOfKeys1.compareTo(numOfKeys2); 
      } 
     }); 
     return ar; 
    } 

    public static void main(String[] s) { 
     Integer[][] myarr = {{0, 10}, {1, 9}, {2, 9}, {3, 9}, {4, 15}, {5, 10}, {6, 4}}; 

     for (Integer[] i : myarr) { 
      System.out.println(i[0] + "," + i[1]); 
     } 

     myarr = mysort(myarr); 

     for (Integer[] i : myarr) { 
      System.out.println(i[0] + "," + i[1]); 
     } 
    } 
} 
+0

Gracias, el programa está funcionando ahora. – Drake

0

También ejecuté su código por completo y funcionó ...una cosa si tuviera que reemplazar el

System.out.println(array[0][p] + " " + array[1][p]); 

con

System.out.println(array[p][0] + " " + array[p][1]); 

para ejecutar el código porque de lo contrario se da un índice de matriz fuera de límites excepción.

Negar la comparación El retorno es más fácil que cambiar los valores y permite un cambio fácil.

+0

Gracias, mis índices estaban mezclados. Tengo mi programa funcionando ahora. – Drake

Cuestiones relacionadas