Как использовать Java Arrays.sort - PullRequest
       0

Как использовать Java Arrays.sort

9 голосов
/ 29 августа 2011

Я узнаю о том, как Arrays.sort(...) работает в Java.

Почему переменные: temp и dopas обе сортируются после единственной сортировки 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

Я ожидал, что допы останутся несортированными.

Ответы [ 13 ]

22 голосов
/ 29 августа 2011

Массивы являются объектами в Java, поэтому при использовании переменных массива вы фактически используете ссылки на массивы.

Таким образом, строка

float[] temp=dopas;

будет копировать только ссылку в массив dopas.Впоследствии dopas и temp указывают на один и тот же массив, поэтому оба будут выглядеть отсортированными после использования sort().

Используйте System.arrayCopy или Arrays.copyOf для создания копии массива.

7 голосов
/ 29 августа 2011

ваше назначение: float[] temp=dopas; на самом деле просто копирует ссылку на массив. Я думаю, что вы хотите сделать, это float[] temp = dopas.clone();

6 голосов
/ 29 августа 2011

temp просто является ссылкой на dopas.На самом деле в памяти только один массив.

Если вы хотите, чтобы temp была копией dopas, попробуйте:

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

Таким образом, вы получите в глубинускопируйте ваш массив вместо поверхностного копирования it!

3 голосов
/ 29 августа 2011

Почему после Array.sort сортируются оба массива?

Поскольку существует только один массив.float[] temp=dopas; не создает новый массив и не копирует существующее содержимое массивов.Он просто копирует массив reference ..., чтобы у вас была ссылка на один и тот же массив в двух местах.

3 голосов
/ 29 августа 2011

Поскольку в Java вы обращаетесь к массивам по ссылке , а не по значению .

Таким образом, temp и dopas являются ссылкамитот же массив.

2 голосов
/ 29 августа 2011

Потому что temp и dopas (то, что мы называем переменной) - это указатели на пространство в памяти.Используя код

float[] temp = dopas

, вы просто говорите, что пусть "temp" указывает на то же пространство в памяти, что и dopas.В результате у вас есть два указателя на одно и то же место в памяти.И сортируя temp, вы сортируете содержимое этого пространства, поэтому, ссылаясь на dopas позже в своем коде, вы получаете те же самые данные.

PS: Dogmatixed упомянул решение вашей проблемы.

2 голосов
/ 29 августа 2011

Когда вы присваиваете temp значение dopas, оно не копирует, а заставляет переменные ссылаться на один и тот же массив.

1 голос
/ 29 августа 2011

temp ссылается на dopas, поэтому, когда dopas сортируется, также и temp. Они фактически указывают на один и тот же массив. Надеюсь, это помогает.

1 голос
/ 29 августа 2011

Потому что temp и dopas - это две ссылки на один и тот же массив

1 голос
/ 29 августа 2011

dopas и temp относятся к одному и тому же массиву и могут использоваться взаимозаменяемо.

float[] temp=dopas;

После этой строки temp[i] будет точно таким же, как dopas[i].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...