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:

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

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



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

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

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

list.remove(3);

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

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

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

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

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

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

Крок 3: стирання сміття

Видалення елемента зі списку 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)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Андрій Рівень 91
27 лютого 2025
Тим хто не розуміє як виконувати задачу "Розбираємо піраміду з келихів", раджу переглянути метод print :)
Олександр Рівень 102
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 з'явилось після отримання перечня оновленої Сонечної системи :) . Чи малось на увазі, що планету треба було назвати "Фаетон"? Чи після появи "Зірки Смерті" третя чи четверта планети зникали б? (на зразок Альдераана?)
Володимир Рівень 26
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
бідний паскаль((