1. Додавання елемента в середину (або в початок) списку

Якщо ж ми хочемо вставити елемент в середину списку, то всередині списку відбувається от що.

Припустімо, у нас є список з 11 елементів:

Ми хочемо вставити число 10 000 у список на позицію з номером 5. Для цього потрібно лише виконати команду:

list.add(5, 10000);

де list — це змінна типу ArrayList, метод add(int index, тип value) додає значення 10000 на позицію 5 у списку. От що в цьому разі відбудеться в методі add():

Крок 1: усі елементи масиву починаючи з 5-го буде зсунуто (скопійовано) на 1 елемент у напрямку кінця масиву:

Зверніть увагу: елементи в 5-й і 6-й комірках масиву тепер однакові.

Крок 2: записуємо в 5-у комірку значення 10 000:

Тепер у списку є всі елементи масиву, а в п'ятій комірці записано число 10 000, як ми й хотіли.



2. Видалення елемента зі списку

Операція видалення елемента зі списку аналогічна його додаванню, тільки процес зворотний.

Давайте видалимо зі списку елемент із номером 3. Для цього потрібно виконати команду:

list.remove(3);

От що в цьому разі відбудеться в методі remove():

Крок 1: елементи масиву починаючи з 4-го буде зсунуто (скопійовано) на одну позицію ближче до початку масиву:

Крок 2: значення змінної size буде зменшено на 1.

Зверніть увагу: кінець масиву виділено сірим кольором, і там є якісь значення. З технічного погляду це сміття. Його треба видалити, щоб не заважати процесу збирання сміття.

Крок 3: видалення сміття



3. Практичні приклади роботи зі списком у Java

Напишімо кілька прикладів роботи зі списками.

Занесімо до списку всі парні числа від 1 до 20:

Код Примітки
ArrayList<Integer> list = new ArrayList<Integer>();

for (int i = 1; i <= 20; i++)
   if (i%2 == 0)
      list.add(i);
Створюємо об'єкт-список

Цикл по всіх числах 1 .. 20
Якщо число ділиться на 2 без остачі,
додати його до списку

А тепер виведімо всі елементи списку на екран:

Код Примітки
ArrayList<Integer> list = new ArrayList<Integer>();

for (int i = 1; i <= 20; i++)
   if (i%2 == 0)
      list.add(i);

for (int i = 0; i < list.size(); i++)
   System.out.println(list.get(i));
Створюємо об'єкт-список
Цикл по всіх числах 1 .. 20

Якщо число ділиться на 2 без остачі,
додати його до списку

Цикл від нуля до розміру списку
Виводимо кожний елемент на екран

Видалення елементів:

А тепер видалімо всі елементи, які діляться на 4. Зверніть увагу, що відразу після видалення одного елемента зі списку позиції решти елементів змінюються.

Код Примітки
ArrayList<Integer> list = new ArrayList<Integer>();

for (int i = 1; i <= 20; i++)
   if (i%2 == 0)
      list.add(i);

for (int i = 0; i < list.size(); i++)
   if (list.get(i)%4 == 0)
   {
      list.remove(i);
      i--;
   }
Створюємо об'єкт-список

Цикл по всіх числах 1 .. 20
Якщо число ділиться на 2 без остачі,
додати його до списку

Цикл від нуля до розміру списку
Якщо елемент списку ділиться на 4 без остачі:

а) видаляємо елемент
б) зменшуємо лічильник i, щоб на наступному витку циклу знову потрапити на той самий елемент

Припустімо, вам потрібно видалити 3 останніх елементи списку.

Як зробити це неправильно:

Код Примітки
ArrayList<Integer> list = new ArrayList<Integer>();

for (int i = 1; i <= 20; i++)
   if (i%2 == 0)
      list.add(i);

int n = list.size();
list.remove(n - 3);
list.remove(n - 2);
list.remove(n - 1);
Створюємо об'єкт-список

У списку 10 елементів: 2, 4, 6, ... 20



n = 10
n - 3 = 7 (у списку залишилось 9 елементів)
n - 2 = 8 (у списку залишилось 8 елементів)
n - 1 = 9 (у списку залишилось 7 елементів)

Після видалення 7-го й 8-го елементів у списку залишиться всього 8 елементів. Тому 9-й елемент видалити не вдасться — у програмі виникне помилка.

Як видаляти елементи правильно:

Варіант 1 Варіант 2
int n = list.size();
list.remove(n - 3);
list.remove(n - 3);
list.remove(n - 3);
int n = list.size();
list.remove(n - 1);
list.remove(n - 2);
list.remove(n - 3);

Елементи потрібно видаляти або з кінця або просто в одному й тому самому місці, а після кожного видалення елементи зсуватимуться на одну позицію.