Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > удаление нескольких элементов из LinkedList


Автор: AbdulBcex 17.6.2010, 17:29
Всем здравствовать. Вопрос назрел, помогите, пожалуйста.

Код

int w;
...
LinkedList list1 = new LinkedList();
LinkedList list2 new LinkedList();
...
for(int qB = 0; qB < purged.size(); qB++){
         for(int qA = 0; qA < purged.size(); qA++){
                    
    if(list1.get(qA).getValue() - list2.get(qB).getValue() > w){
            
                        list2.remove(qB);
                        
            list2.add(qB, new DataTuple(qB, element));//без этой строки будет IndexOutOfBoundsException
                
            }
    }
            
}


Как вообще в принципе в такой ситуации действовать? Только ловить исключение нельзя, должны быть удалены все элементы удвлетворяющие условию, а оператор remove() вычитает индексы и уменьшает список, видимо поэтому индексы растут соответственно первому значению. 
Или все-таки лыжи не едут?

Автор: MaxPayneC 17.6.2010, 17:41
Удалять из коллекции в цикле, итерирующимся по ней, корректно можно только с помощью iterator.remove().

Автор: EnJ 17.6.2010, 18:02
Чему равно purged.size()? Он совпадает с размером list2?
Конечно он будет бросать иксепшн, если не добавлять новые элементы. Скорее всего purged.size() > list2.size().
Или удаляя элемент ты автоматически уменьшаешь размер листа и сдвигаешь индексы элементов за удаленным объектом.

А что собственно надо сделать?

Автор: jk1 17.6.2010, 19:58
Код

        int w;
        ...
        LinkedList list1 = new LinkedList();
        LinkedList list2 = new LinkedList();
        ...
        for (DataTuple aList1 : (Iterable<DataTuple>) list1) {
            for (Iterator<DataTuple> list2Iterator = list2.iterator(); list2Iterator.hasNext();) {
                if (aList1.getValue() - list2Iterator.next().getValue() > w) {
                    list2Iterator.remove();
                }
            }

        }

Автор: AbdulBcex 18.6.2010, 10:47
Спасибо большое, удаление через итератор - отличный план!

Вроде функционирует.

Цитата

Чему равно purged.size()? Он совпадает с размером list2?

Извиняюсь, буду внимательней в следующий раз, purged и list2 одно и тоже.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)