2012-10-10 25 views
6

Tengo una matriz de dobles, en Java: arr1 que quiero ordenar. Lo más probable es que la primera opción sea el método de utilidad Arrays.sort(double[]).Clasificar matriz y reflejar los cambios en otra matriz

La idea es que quiero los mismos cambios (por ejemplo, valor en index i se intercambia con el valor en index j en arr1) a reflejarse en otra matriz de enteros: arr2 (en el sentido de que los valores en los mismos índices se cambian también en arr2).

¿Hay una manera simple (un truco) para lograr esto en Java? ¿O la única forma es implementar el algoritmo de clasificación yo solo?

ACTUALIZACIÓN: Veo que personas recomiendan la sustitución de las dos matrices con una matriz de objetos que contienen los 2 valores (uno de arr1 y uno de arr2). ¿No traería esto algunas penalizaciones de eficiencia? En otras palabras, ¿no es menos eficiente ordenar una matriz de objetos que una matriz de tipos primitivos (en este caso, los dobles)?

La información es completamente estática. Es grande (cabe en la memoria) pero estático.

+2

Tener una variedad de índices. No ordene la matriz de valores, ordene la matriz de índices. Luego use la matriz de índice para apuntar a ambas matrices de valores. Consulte la solución en: http: //stackoverflow.com/questions/4859261/get-the-indices-of-an-array-after-sorting – Raihan

+0

http://stackoverflow.com/questions/112234/sorting-matched-arrays -in-java – talnicolas

+0

Esto es lo que se llamaría un "tipo externo". –

Respuesta

7

En lugar de tratar de mantener arreglos paralelos ordenados, una solución más limpia sería crear una clase que encapsule ambos valores de datos, y solo tenga una matriz de objetos.

(Pero para responder a su pregunta, no hay una forma incorporada de hacerlo en Java. Implementar su propia rutina de clasificación que mantiene ordenadas dos matrices basadas en valores en una de ellas funcionaría para una pequeña cantidad de datos que no es probable que cambie, pero sería difícil de mantener.)

+0

Ordenar una matriz de objetos es tan eficiente como ordenar una matriz de dobles? – Razvan

+0

@Razvan Ordenar una matriz de objetos será extremadamente eficiente. Dudo que puedas medir la diferencia. –

+1

pensé que debería mencionar la interfaz 'Comparable' para su nuevo objeto. http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html –

1

Una solución que no afecta el rendimiento de la ordenación, es decir, todavía O (nlog (n)) complejidad del tiempo.

  • Use un mapa para almacenar array[i] -> i
  • ordenar la matriz
  • iterar sobre la matriz ordenada, y para cada valor, lo utilizan como una clave para el mapa para recuperar el índice original.

Editar: Raihan comentario me hace parecer triste :(

1

Trate de esta manera ....

- convertirla en arrayArrayList utilizando el Arrays.asList()

- Cree otra variable de referencia de objeto de lista y asigne el mismo objeto ArrayList a ella. Ahora, cualquier cambio en la primera ArrayList se reflejará en el Se cond ArrayList.

Ej:

double[] array = new double[10]; 

ArrayList<Double> arList_1 = new ArrayList<Double>(Arrays.asList(array)); 

ArrayList<Double> arList_2 = arList2; 

Ahora para la clasificación, hay 2 opciones:

- Uso java.lang.Comparable interfaz, si desea ordenar que sólo en 1 manera.

- Use java.util.Comparator Interfaz, si desea ordenarla en más de 1 vía.

0

Tenga en cuenta que lo que está buscando, pero otro trabajo podría ser así.

Crear un mapa para mantener la relación entre arr1 y arr2 elments

 Map<Double, Double> myLocalMap<Double, Double>(); 
     for(int ind=0; indx < arr1.length; indx++){ 
      myLocalMap.put(Double.valueOf(arr1[indx]), Double.valueOf(arr2[indx])); 
     } 

Ahora tipo arr1 como usted ha dicho:

 Arrays.sort(arr1); 

Una vez arr1 está ordenada, actualizar arr2 de la siguiente manera:

 for(int ind=0; indx < arr1.length; indx++){ 
      arr2[indx] = myLocalMap.get(arr1[indx]).doubleValue(); 
     } 
Cuestiones relacionadas