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

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

Java Syntax Zero
Рівень 13 , Лекція 5
Відкрита

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);

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


Коментарі (16)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Андрій Рівень 24
27 лютого 2025
Тим хто не розуміє як виконувати задачу "Розбираємо піраміду з келихів", раджу переглянути метод print :)
Олександр Рівень 44
7 грудня 2024
Цікава логіка задачі про планети. Якщо написати planets.add(planets.indexOf("Земля")+1,planetName); зщзв'язок приймається, а якщо planets.add(planets.indexOf("Марс"),planetName); то ні. Хоча обидва дають однаковий результат
Ва Дим Рівень 28
13 квітня 2024
хороші задачки.Легенькі прям кайфонув)
AsVAN Рівень 1 Expert
9 лютого 2023
Видалення елемента зі списку 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 Рівень 51
22 лютого 2023
третім елементом колекції було число 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
Автори першої задачі тупо тролі :)
Гаркін Рівень 14
21 травня 2024
але ж там не обов'язково обмежувати себе (3, planetName) я використав (planets.indexOf("Земля") + 1, planetName) Правда +1 з'явилось після отримання перечня оновленої Сонечної системи :) . Чи малось на увазі, що планету треба було назвати "Фаетон"? Чи після появи "Зірки Смерті" третя чи четверта планети зникали б? (на зразок Альдераана?)
Володимир Рівень 18
11 березня 2025
"Фаетон" мав би бути між Марсом і Юпітером.
WhoAMI Рівень 51
14 жовтня 2022
Рекомендую прочитати цю статтю, тоді стає зрозуміліше https://javarush.com/groups/posts/1935-udalenie-ehlementa-iz-spiska-arraylist
WhoAMI Рівень 51
14 жовтня 2022
не зрозумів пояснення лекції з видаленням елементу. згідно із описом і скрінами то в пам'яті не видаляється саме значення яке в комірці, а просто видаляється сама комірка (при тому щей остання а не та яку ми зазначили під індексом). Щось наплутано. поясніть будь-ласка
Yaroslav Tkachyk Рівень 23 Expert
4 січня 2023
Наскільки я зрозумів - то видаляється вказаний елемент з комірки (index). Комірка тимчасово має значення null. Далі копіюються всі елементи, що слідували за видаленим (від index+1 до list.size()-1) і вставляються на місце видаленого елемента. (зсовуються на 1 позицію).
Roma Chernesh Рівень 16
23 січня 2023
хм... я навпаки думав, що ніяких тимчасових 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 Рівень 36
23 липня 2022
В другому завданні будьте уважні, там не просто елемент, а саме значення.
Anonymous #696530 Рівень 19
22 вересня 2022
Коли вписуєш індекс елемента, програма видаляє Паскаль, але перевірку не проходить. Чому?
Andriy Рівень 16
29 жовтня 2022
А де береш індекс? Скоріш за все, при перевірці елементи в іншому порядку, тому видаляти потрібно не по індексу, а по обєкту.
Олександр Рівень 18
7 грудня 2023
бідний паскаль((