Объяснение
Основная проблема вашего кода заключается в том, что вы предполагали, что можете напрямую добавить что-то на более позднюю позицию в ArrayList
, используя add(index, element)
.
Но это не так массив, это список. Это невозможно. Метод add
не позволяет добавлять сверх его текущего размера , который по-прежнему равен 0
. Как объяснено в документации этого метода:
Броски: IndexOutOfBoundsException
- если индекс выходит за пределы диапазона (index < 0 || index > size())
Fix
Чтобы исправить ваш код и продолжать этот подход, вы должны сначала убедиться, что список уже имеет желаемый размер, предварительно заполнив его данными для мусора, например, большим количеством null
s. И затем делать то, что вы пытались сделать, но с помощью set
, а не add
(иначе вы не изменили бы существующие записи, а изменили бы их). Итак, что-то вроде этого:
List<T> reversed = new ArrayList<>();
// Fill with garbage
for (int i = 0; i < seznam.size(); i++) {
reversed.add(null);
}
// Exchange against elements
int i = seznam.size() - 1;
for (T element : seznam) {
reversed.set(i, element);
i--;
}
Правильное решение
Очевидно, что заполнение списка сначала данными для мусора - не идеальный подход. Вы можете сделать намного лучше. Как насчет добавления в ваш новый список вперед, но итерации исходных элементов в обратном направлении. Поэтому, если у вас есть [1, 2, 3]
, вы добавляете 3
, 2
и, наконец, 1
. Это может быть легко достигнуто:
List<T> reversed = new ArrayList<>();
for (int i = seznam.size() - 1; i >= 0; i--) {
reversed.add(seznam.get(i));
}
Примечание
Есть и другие подходы к этому, и Java также имеет встроенные методы для этого, если это вариант для вас, например Collections.reverse(list)
.
Например, см. Как получить перевернутый вид списка в списке в Java?