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:

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

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


13
Задача
Java Syntax Zero,  13 рівень5 лекція
Недоступна
Сонячна система
У 3020 році вчені навчилися створювати нові планети, одну з яких відправили в Сонячну систему. Орбіта цієї планети пролягає між орбітами Землі та Марса. Реалізуй метод createNewPlanet(String), який має додавати передану планету в список planets одразу за Землею. Подивись, як змінилася послідовність

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

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

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

list.remove(3);

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

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

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

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

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

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

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

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


13
Задача
Java Syntax Zero,  13 рівень5 лекція
Недоступна
Бувай, Паскалю
У методі main знайди й видали мову програмування Pascal зі списку programmingLanguages.

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

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


13
Задача
Java Syntax Zero,  13 рівень5 лекція
Недоступна
Розбираємо піраміду з келихів
Задача проста: потрібно розібрати піраміду з келихів. А допоможе нам у цьому метод removeGlassesReverse. Цей метод має прибирати кожен ряд, починаючи з верхнього (з кінця списку). Тобі потрібно реалізувати цей метод. У тестуванні тобі допоможе метод main. Спробуй запустити програму й подивитися, що
Коментарі (16)
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Андрій
Рівень 82
27 лютого, 16:21
Тим хто не розуміє як виконувати задачу "Розбираємо піраміду з келихів", раджу переглянути метод print :)
Олександр
Рівень 84
7 грудня 2024, 09:40
Цікава логіка задачі про планети. Якщо написати planets.add(planets.indexOf("Земля")+1,planetName); зщзв'язок приймається, а якщо planets.add(planets.indexOf("Марс"),planetName); то ні. Хоча обидва дають однаковий результат
Ва Дим
Рівень 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 березня, 22:49
"Фаетон" мав би бути між Марсом і Юпітером.
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
бідний паскаль((