2011-08-29 10 views
9

Estoy aprendiendo cómo funciona Arrays.sort(...) en Java.Cómo usar Java Arrays.sort

¿Por qué son variables: temp y dopas ambos ordenados después de la única clasificación temp?

System.out.println("Before"); 
for (int i = 0; i < POP; i++) 
    System.out.println(dopas[i]+"");   //dopas is unsorted 

System.out.println("After"); 
float[] temp=dopas; 
Arrays.sort(temp);       //sort temp 

for (int i = 0; i < POP; i++) 
    System.out.println(temp[i]+" "+dopas[i]); //Both temp and dopas are now sorted 

I expected dopas to remain unsorted.

Respuesta

22

Las matrices son objetos en Java, por lo tanto, al usar variables de matriz, en realidad está utilizando referencias a matrices.

Así, la línea de

float[] temp=dopas; 

, solamente se copiará la referenciaa la matriz dopas. Después, dopas y temp apuntan a la misma matriz, por lo tanto, ambos aparecerán ordenados después de usar sort().

Use System.arrayCopy o Arrays.copyOf para crear una copia de la matriz.

3

Debido a que en Java, puede acceder a las matrices por referencia, no por valor.

Así que temp y dopas son referencias a la misma matriz.

+1

+1 porque usted fue el primero en responder :) – Fortega

2

Cuando asigna temp el valor de dopas, no hace una copia, hace que las variables se refieran a la misma matriz.

3

¿Por qué después de Array.sort ambos arreglos están ordenados?

Porque solo hay una matriz. float[] temp=dopas; no crea una nueva matriz ni copia los contenidos de las matrices existentes. Simplemente copia una matriz referencia ... para que tenga la referencia de la misma matriz en dos lugares.

1

Porque las matrices temp y dopas son las mismas. La asignación temp=dopas; asigna una referencia a la matriz. No copia su contenido. Esta es la razón por la que cuando ordena el primero también ordena el segundo.

0

temp y dopas comparten el mismo puntero, ya que no crea una nueva instancia de matriz, solo debe asignar el mismo puntero.

1

dopas y temp se refieren a la misma matriz y se pueden usar indistintamente.

float[] temp=dopas; 

Después de esta línea, temp[i] será exactamente el mismo que dopas[i].

1

Debido temporal y dopas son dos referencias a la misma matriz

2

Debido temporal y dopas (lo que llamamos una variable) son punteros a un espacio en la memoria.Al utilizar el código de

float[] temp = dopas 

que sólo digo que "temp" apuntan al mismo espacio en la memoria como dopas hace. El resultado es que tiene dos punteros al mismo espacio en la memoria. Y al ordenar la temperatura, ordena los contenidos de ese espacio, por lo que al hacer referencia a los dopas más adelante en su código, está accediendo exactamente a los mismos datos.

PD: Dogmatixed mencionó una solución a su problema.

7

su asignación: float[] temp=dopas; es en realidad solo copiar una referencia a la matriz. Lo que creo que quiere hacer es float[] temp = dopas.clone();

+0

+1 en la solución – Chris

6

temp simplemente es una referencia a dopas. En realidad, solo hay una matriz en la memoria.

Si desea temp a ser una copia de dopas, intente:

float[] temp = Arrays.copyOf(dopas, dopas.length); 

De esta manera, se quiere copia profunda su matriz en lugar de la copia superficial él!

1

temp hace referencia a dopas, por lo que cuando se clasifican las dopas también lo hace la temperatura. De hecho, apuntan a la misma matriz. Esto ayuda.

0

temp y dopas hacen referencia a la misma matriz.

si quiere que la temperatura actúe como una nueva matriz, entonces use clone() método.

float[] temp = dopas.clone(); 

El método clone() crea una nueva matriz y copia el contenido de los dopas a la matriz recién creada.