Обращение к спискам массивов: почему я должен равняться половине размера списка?

#java #arraylist

#java #список массивов

Вопрос:

Ранее сегодня мой профессор дал задание в классе обратить массив без возврата нового массива, и он ожидал (но не сказал), что мы сделаем это без добавления элементов. Решение, которое я придумал, заключается в следующем:

 ArrayList<Double> al = new ArrayList<Double>();
  al.add(5.00);
  al.add(1.00);
  al.add(4.00);
  al.add(2.00);
  al.add(3.00);
for (int i = al.size()-1; i >=0; i--)
{
   double temp = al.get(i);
   int zeroUp = ((al.size()-1)-i);

   al.set(zeroUp, temp);
}
System.out.println(al.toString());
  

Который prints: [3.0, 2.0, 4.0, 2.0, 3.0]. Я заметил, что он останавливается на полпути каждый раз, но я не понимаю почему. Set() не удаляет элемент, значение которого должно быть отправлено в переданный индекс, не так ли? Я нашел на каком-то случайном веб-сайте, что правильный ответ:

 for (int i = al.size() / 2; i >=0; i--)
{                                   
   double temp = al.get(i);
   int zeroUp = ((al.size()-1)-i);
   al.set(i, al.get(zeroUp));
   al.set(zeroUp, temp);
}
System.out.println(al.toString());
  

Вывод: [5.0, 1.0, 4.0, 2.0, 3.0]

Опять же, по какой причине мы должны делить size() на 2 и определять значение для элемента, отмеченного мной?

Ответ №1:

Потому что вы обращаете массив на месте. Вы правы, полагая, что Set() это не удаляет элемент, значение которого должно быть отправлено в переданный индекс.

Итак, у вас есть массив [5,1,4,2,3]. Как только вы пройдете половину пути через свою функцию, массив будет равен [3,2,4,2,3]. Обратите внимание, что элементы по обе стороны от среднего элемента являются зеркалами друг друга. Это означает, что когда вы пытаетесь установить вторую половину равной первой половине, первая половина уже равна второй половине.

Другими словами, чтобы обратить ваш массив, вам нужно только поменять местами первую половину со второй половиной. [5,1,4,2,3] -> [3,1,4,2,5] -> [3,2,4,1,5]

Я не знаю, так ли это ясно, как могло бы быть, но я надеюсь, что это помогает

Комментарии:

1. Ты быстрый! Сразу после того, как я опубликовал это, я записал массив на листе бумаги и сразу заметил, что я никогда не «сохраняю» перезаписанное значение каким-либо образом. Я искренне разочарован тем, что не обратил на это внимания во время урока. Я сидел здесь, держа в руках свой ответ, пока не понял его. Теперь я полностью понимаю. Спасибо!