Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
AlexRu18
5 / 5 / 3
Регистрация: 29.01.2015
Сообщений: 189
1

Удаление из коллекции

21.01.2017, 23:12. Просмотров 426. Ответов 17
Метки нет (Все метки)

Добрый день.
Есть коллекция accounts, из неё нужно убрать один элемент, переданный параметром функции.
Пытаюсь найти индекс элемента и затем удалить его.
Никак не могу поймать индекс у элемента number, что я делаю не так и как проще можно написать данный блок?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void removeAccount(Long number) {
        for (Account account : accounts) {
            System.out.println("У клиента есть счёт №: " + account.number);
            if (accounts.contains("number")) { 
                int index = accounts.indexOf("number");
                System.out.println("Index is: " + index);
                accounts.remove(index);
                System.out.println("Удалён!");
            } else {
                System.out.println("Счёта с номером " + number + " у данного пользователя не существует!");
 
            }
 
        }
    }
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2017, 23:12
Ответы с готовыми решениями:

Удаление из коллекции
Драсти! Проблемка такая. Есть два списка. Один стринговый на 50 элементов, а...

Удаление элементов коллекции
Привет всем)помогите пожалуйста разобраться почему не работает код: public...

Удаление элемента из Set-коллекции
Проблема вот в чем, нужно из cats удалить одного "кота" Что я делаю не так?...

Удаление ключей в коллекции мап
Здравствуйте,проблема следующая : создается коллекция Treemap(который уже по...

Коллекции
Посоветуйте пожалуйста статью о коллекциях, именно для новичков, или книгу, где...

17
xoraxax
1441 / 1339 / 400
Регистрация: 05.07.2013
Сообщений: 6,501
Завершенные тесты: 2
21.01.2017, 23:17 2
https://docs.oracle.com/javase/8/doc...ion.Predicate-
0
AlexRu18
5 / 5 / 3
Регистрация: 29.01.2015
Сообщений: 189
21.01.2017, 23:38  [ТС] 3
к сожалению не смог разобраться как именно нужно это сделать.

Ещё нашёл такой пример
Java
1
2
3
4
5
6
7
8
for (Iterator<Account> iterator = accounts.iterator(); iterator.hasNext(); ) {
            Account str = iterator.next();
            if (str.equals(number)) {
                System.out.println("Checking "+str);
                accounts.remove(str);
            }else {
                System.out.println("Счёта с номером " + number + " у данного пользователя не существует!");}
        }
но тоже, увы, не помогает.
0
xoraxax
1441 / 1339 / 400
Регистрация: 05.07.2013
Сообщений: 6,501
Завершенные тесты: 2
21.01.2017, 23:42 4
Java
1
2
Collection<MyObject> c = ...;
c.removeIf(o->o.aField==2);
0
AlexRu18
5 / 5 / 3
Регистрация: 29.01.2015
Сообщений: 189
21.01.2017, 23:54  [ТС] 5
А, видимо я ошибся. У меня Лист, не коллекция.

И вот простой пример:
Java
1
2
arrayList.remove(0); // удаляем по индексу
arrayList.remove("number"); // удаляем по объекту
Но я никак не могу его реализовать у себя.
0
xoraxax
1441 / 1339 / 400
Регистрация: 05.07.2013
Сообщений: 6,501
Завершенные тесты: 2
22.01.2017, 00:08 6
List это Collection.
Цитата Сообщение от AlexRu18 Посмотреть сообщение
Но я никак не могу его реализовать у себя.
что это вообще значит?
0
AlexRu18
5 / 5 / 3
Регистрация: 29.01.2015
Сообщений: 189
22.01.2017, 00:24  [ТС] 7
Мысль понял.

Java
1
2
3
4
5
6
7
8
public ArrayList<Account> accounts = new ArrayList<>();
...
public void removeAccount(Long number) {
for (Account account : accounts) {
            System.out.println("У клиента есть счёт №: " + account.number);
            accounts.removeIf(accounts.account -> account.number== number);
 
...
Но делаю явно что-то неверно.
0
vcrop
220 / 180 / 81
Регистрация: 14.06.2016
Сообщений: 398
22.01.2017, 00:35 8
А просто
Java
1
2
public void removeAccount(Long number) {
   accounts.removeIf(account -> account.number == number);}
?
0
AlexRu18
5 / 5 / 3
Регистрация: 29.01.2015
Сообщений: 189
22.01.2017, 00:52  [ТС] 9
Нет, пробовал.
Видимо на вот это ругается
Java
1
for (Account account : accounts) {
XML
1
Lambda expression's parameter account cannot redeclare another local variable defined in an enclosing scope.
0
turbanoff
Эксперт Java
4019 / 3754 / 742
Регистрация: 18.05.2010
Сообщений: 9,329
Записей в блоге: 11
Завершенные тесты: 1
24.01.2017, 02:00 10
AlexRu18, Последний пример выглядит рабочим. По крайней мере ваша ошибка не связана с ним.
Вы что-то не так написали в вашем коде.
0
Chibison
6 / 6 / 4
Регистрация: 16.01.2017
Сообщений: 31
24.01.2017, 02:15 11
Как я вижу решение
Если у аккаунта есть поле number то оно либо long либо int
Так же как я понимаю, у вас есть колллекция ArrayList с дженериком Account, но не String
поэтому строка if (accounts.contains("number")) немного безсмыслена,
только если не переопределён метод toString()
ну да ладно, вернёмся к изголовью
Есть объект Аккаунт у которого есть поле number с типом int или long
тогда чтобы вытереть чётко по номеру



Java
1
2
3
4
5
6
7
8
9
10
11
12
13
    public void removeAccount(Long number) 
    {
        int i = 0;
        
        for (Account account : accounts) 
        {
            if (account.number == number) 
                accounts.remove(i);
            
            i ++;
 
        }
    }
P.S. Такое ощущение как будто ищем чёрного кота в чёрной комнате, но есть мелкий просвет.
AlexRu18, Вы бы хотя бы приложили свой объект Account к теме, чтобы людям было понятно что у вас там твориться и вам быстрее могли помочь.
0
we2seek
80 / 80 / 42
Регистрация: 25.01.2010
Сообщений: 385
24.01.2017, 02:33 12
Цитата Сообщение от turbanoff Посмотреть сообщение
Последний пример выглядит рабочим
а мне он не кажется рабочим, т.к. коллеции в потоках иммутабельны... надо проверять в общем

Добавлено через 17 минут
Sorry, посмотрел исходники removeIf - я не прав
Java
1
2
3
4
5
6
7
8
9
10
11
12
default boolean removeIf(Predicate<? super E> filter) {
        Objects.requireNonNull(filter);
        boolean removed = false;
        final Iterator<E> each = iterator();
        while (each.hasNext()) {
            if (filter.test(each.next())) {
                each.remove();
                removed = true;
            }
        }
        return removed;
    }
0
AlexRu18
5 / 5 / 3
Регистрация: 29.01.2015
Сообщений: 189
24.01.2017, 11:22  [ТС] 13
Спасибо, но я уже решил проблему.
Проблема была в том, что удаление происходит в цикле, а не после

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void removeAccount(Long number) {
 
        int index = -1;
        for (Account account : accounts) {
            System.out.println("У клиента есть счёт №: " + account.number);
 
            index = accounts.indexOf(account);
            if (!(index == -1)) {
                //System.out.println("Index is: " + index);
 
            } else {
                System.out.println("Счёта с номером " + account.number + " у данного пользователя не существует!");
 
            }
            // accounts.clear(); - Полная очистка коллекциии
        }
        accounts.remove(index);
        System.out.println("Удалён!");
    }
0
vcrop
220 / 180 / 81
Регистрация: 14.06.2016
Сообщений: 398
24.01.2017, 18:18 14
Chibison, не удаляй так. Получишь только ConcurrentModificationException.
0
Chibison
6 / 6 / 4
Регистрация: 16.01.2017
Сообщений: 31
24.01.2017, 18:29 15
Цитата Сообщение от vcrop Посмотреть сообщение
ConcurrentModificationException.
Теперь буду иметь ввиду, кстати, хотел узнать, почему она может вылезти в такой момент и как тогда лучше вытирать, ибо порой лезет такая дрянь, но в основном её встречал при вытирании из коллекций Set, HashSet ну и List порой.
0
vcrop
220 / 180 / 81
Регистрация: 14.06.2016
Сообщений: 398
24.01.2017, 18:41 16
forEach здесь это проход итератором. А ты изменяешь в это время коллекцию. Выше we2seek написал корректный пример.
0
Chibison
6 / 6 / 4
Регистрация: 16.01.2017
Сообщений: 31
24.01.2017, 19:00 17
Я на Java 7. Я почему то сильно в работу коллекций и их ошибок/исключений не вникал, теперь только щас допёр что я считаю и удаляю и список становиться на запись меньше и тут что-то может пойти не так при моём подходе. Ну теперь если я буду подходить таким способом, то не для удаления )
0
AlexRu18
5 / 5 / 3
Регистрация: 29.01.2015
Сообщений: 189
24.01.2017, 21:25  [ТС] 18
Посмотри в моём примере где стоит remove
0
24.01.2017, 21:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2017, 21:25

Коллекции
Здравствуйте. Я новичок в изучении java. Нужна помощь Задание:...

Коллекции
Java Создать коллекцию

Коллекции
Доброго времени суток. Никак не могу разобраться с коллекциями в java, а именно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru