Для цикла в исключении ArrayList - PullRequest
0 голосов
/ 02 сентября 2011

Я прошу прощения за ограниченное название, но я не знаю, как точно описать эту проблему. У меня есть цикл for, который проходит через arrayList, содержащий объект. Одним из методов объектов является логическое значение, которое устанавливается в другой момент времени. Смысл цикла for состоит в том, чтобы пройти через arrayList и удалить каждый элемент, содержащий логическое значение, как false.

if(!arrayList.isEmpty()){
   int len = arrayList.size();
   for(int i=0; i<len; i++){
    if(!arrayList.get(i).isStartTimer()){
        arrayList.remove(i);
    }
  }
}

Цикл for всегда оставляет слишком много объектов в массиве. Это связано с тем, что каждый раз при цикле цикла for len падает на единицу из-за удаленного элемента в массиве, а последний объект отменяет цикл for до того, как удаляет объект. Я понимаю проблему, но не могу понять, как ее исправить. Я пытался сделать что-то вроде len + 1, но он выдает исключение indexOutOfBounds, когда я что-то с ним делаю. Есть идеи? Кроме того, это лучший способ сделать то, что я пытаюсь сделать?

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

Вы можете переключиться на время:

if( ! arrayList.isEmpty() ){
    int i = 0;
    while( i < arrayList.size() ) {
        if( ! arrayList.get(i).isStartTimer() ){
            arrayList.remove(i); 
            continue; // skip i++
        }
        i++;
    }
}
1 голос
/ 02 сентября 2011

Вы должны выполнить цикл в обратном направлении, чтобы не использовать индикаторы, которые следуют за удаленными элементами.

for (int i = arrayList.size() - 1; i >= 0; i--) {

}

В качестве альтернативы, вы можете просто уменьшить i, чтобы использовать следующий индекс, и избавиться от него.переменной len, чтобы конечное условие использовало фактическую длину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...