JavaRush/Курси/Java Syntax Zero/Робота з ArrayList, частина 2

Робота з ArrayList, частина 2

Відкрита

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, як ми й хотіли.


13
Задача
Java Syntax Zero,  13 рівень,  5 лекція
Недоступна
Сонячна система
Сонячна система

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

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

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

list.remove(3);

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

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

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

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

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


13
Задача
Java Syntax Zero,  13 рівень,  5 лекція
Недоступна
Бувай, Паскалю
Бувай, Паскалю

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, щоб на наступному витку циклу знову потрапити на той самий елемент

Є простіший спосіб — іти списком з кінця: for (int i = list.size() - 1; i >= 0; i--). Тоді зсув індексів не заважає і i-- у тілі циклу не потрібен. А ще можна використати вже знайомий вам метод removeIf(): list.removeIf(x -> x % 4 == 0);

Припустімо, вам потрібно видалити 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);

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


13
Задача
Java Syntax Zero,  13 рівень,  5 лекція
Недоступна
Розбираємо піраміду з келихів
Розбираємо піраміду з келихів
Коментарі (17)
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Андрій
Рівень 93
27 лютого 2025, 16:21
Тим хто не розуміє як виконувати задачу "Розбираємо піраміду з келихів", раджу переглянути метод print :)
Олександр
Рівень 102
7 грудня 2024, 09:40
Цікава логіка задачі про планети. Якщо написати planets.add(planets.indexOf("Земля")+1,planetName); зщзв'язок приймається, а якщо planets.add(planets.indexOf("Марс"),planetName); то ні. Хоча обидва дають однаковий результат
hidden #3421731
Рівень 28
13 квітня 2024, 13:48
хороші задачки.Легенькі прям кайфонув)
AsVAN
Рівень 1
Expert
9 лютого 2023, 10:24
Видалення елемента зі списку list {5, 10, 15, 25, 10 000, 30, 35, 40, 45, 50, 100, 100} list.remove(3); -видаляємо третій елемент отримуємо новий list {5, 10, 15, 25, 10 000, 30, 35, 40, 45, 50, 100, ,був видалений} Щось це я не зрозумів, на мій погляд в цьому прикладі допущена помилка.
theylovevalera Backend Developer в шукаю роботу
22 лютого 2023, 17:42
третім елементом колекції було число 20: list {5, 10, 15, 20, 25, 10 000, 30, 35, 40, 45, 50, 100,} після виклику методу list.remove всі значення зсунулися на одну догори: list {5, 10, 15, 25, 10 000, 30, 35, 40, 45, 50, 100, 100} і після цього останній елемент масиву було видалено: list {5, 10, 15, 25, 10 000, 30, 35, 40, 45, 50, 100, ,був видалений} Помилок ніяких не було,просто у прикладі показано вміст колекції після зсуву на один елемент)Сподіваюсь,що нормально пояснив)
SoniaSapsan
Рівень 17
24 січня 2023, 08:43
Автори першої задачі тупо тролі :)
Гаркін
Рівень 14
21 травня 2024, 19:28
але ж там не обов'язково обмежувати себе (3, planetName) я використав (planets.indexOf("Земля") + 1, planetName) Правда +1 з'явилось після отримання перечня оновленої Сонечної системи :) . Чи малось на увазі, що планету треба було назвати "Фаетон"? Чи після появи "Зірки Смерті" третя чи четверта планети зникали б? (на зразок Альдераана?)
Володимир
Рівень 26
11 березня 2025, 22:49
"Фаетон" мав би бути між Марсом і Юпітером.
Наталія
Рівень 62
22 квітня, 20:46
тільки після цього коменту вдалося вирішити :)
WhoAMI
Рівень 51
14 жовтня 2022, 11:07
Рекомендую прочитати цю статтю, тоді стає зрозуміліше https://javarush.com/groups/posts/1935-udalenie-ehlementa-iz-spiska-arraylist
WhoAMI
Рівень 51
14 жовтня 2022, 08:38
не зрозумів пояснення лекції з видаленням елементу. згідно із описом і скрінами то в пам'яті не видаляється саме значення яке в комірці, а просто видаляється сама комірка (при тому щей остання а не та яку ми зазначили під індексом). Щось наплутано. поясніть будь-ласка
Yaroslav Tkachyk
Рівень 23
Expert
4 січня 2023, 11:58
Наскільки я зрозумів - то видаляється вказаний елемент з комірки (index). Комірка тимчасово має значення null. Далі копіюються всі елементи, що слідували за видаленим (від index+1 до list.size()-1) і вставляються на місце видаленого елемента. (зсовуються на 1 позицію).
Roma Chernesh
Рівень 16
23 січня 2023, 11:01
хм... я навпаки думав, що ніяких тимчасових null нема. починаючи з наступного елемента (після видаленого) значення копіюють у передостанній елемент. І так до останнього елемента. І в кінці останній видаляють. *тобто, зі списку "а b c d e" видаляємо "b": // a b c d e 1) значення "с" записуємо у "b"; // a c c d e 2) значення "d" записуємо у "c"; // a c d d e 3) значення "е" записуємо у "d"; // a c d e e 4) видаляємо "е". // a c d e
Niko Java Developer
23 липня 2022, 15:10
В другому завданні будьте уважні, там не просто елемент, а саме значення.
Anonymous #696530
Рівень 19
22 вересня 2022, 09:52
Коли вписуєш індекс елемента, програма видаляє Паскаль, але перевірку не проходить. Чому?
Andriy
Рівень 16
29 жовтня 2022, 11:08
А де береш індекс? Скоріш за все, при перевірці елементи в іншому порядку, тому видаляти потрібно не по індексу, а по обєкту.
Олександр
Рівень 18
7 грудня 2023, 23:00
бідний паскаль((