2016-02-29 2 views
1

Я реализую логику в пределах for-loop, которая удалит любые объекты собаки со статусом «ПРИНЯТЫЕ» из объекта питомника.Удаление элементов в arrayList: попытка удалить из индекса, которого нет?

Учтите, что у питомника может быть список много собак.

Loop:

allDogsInKennel = kennel.getDogsList(); 
for (int i = 0; i < allDogsInKennel.size(); i++) { 
    //delete any dog object with a status of Accepted 
    if (allDogsInKennel.get(i).getStatus() == "ACCEPTED") { 
    kennel.removeDog(allDogsInKennel.get(i)); 
    } 
} 

метод removeDog

public void removeDog(Dog d) { 
     this.dogList.remove(d); 
} 

Проблема у меня есть, например, все 6 собак в списке следует удалить, но в настоящее время удаляются только 3.

Пример:

original size of list = 6 items 

Item removed from index 0 = 5 items 

Item removed from index 1 = 4 items 

item removed from index 2 = 3 items 

Теперь в следующей итерации цикла пытается удалить из index 3 вследствие i++ состояния, но массив будет идти только index 2 как он теперь имеет только 3 пункты в индексах:

0, 1, 2 

Как я могу изменить свою логику выше, чтобы гарантировать, что все элементов удалены из массива?

ответ

1

Вы можете добавить i-- при удалении объекта из списка;

for (int i = 0; i < allDogsInKennel.size(); i++) { 

    //delete any dog object with a status of Accepted 
    if (allDogsInKennel.get(i).getStatus().equals("ACCEPTED")) { 
     kennel.removeDog(allDogsInKennel.get(i)); 
     i-- 
    } 
} 

Давайте предположим, что у вас есть ArrayList и есть строка obj1, obj2, obj3

ArrayList<String> lst = new ArrayList<String>(); 
lst.add("obj1"); 
lst.add("obj2"); 
lst.add("obj3"); 

for (int i = 0; i < lst.size(); i++) { 
    String str = lst.get(i); 
    lst.remove(str); //list size decrease, 
    //so when you remove an object with index 0, your new list has obj2(at index 0) and obj3(at index 1) 
    //when i is increased, it will escape obj2, it never check it or access it. 
    //i--; //open to give a try 
} 

for (int i = 0; i < lst.size(); i++) { 
    System.out.println(lst.get(i)); //will print obj2 
} 

Ожидаемое является удаление всех элементов в списке, так что я должен добавить i-- после Вытащите метод

+1

Это похоже на работу, это правильное решение или просто обходной путь? – java123999

+0

Например, если в списке есть 5 объектов, и если вы удаляете 3-й объект. теперь индексы изменяются, а индекс 4-го объекта теперь равен 2 (3-й объект в списке). Поэтому я считаю, что это правильное решение. Для получения дополнительной информации я отредактирую ответ и попытаюсь дать больше примера –

+0

Правильное решение - не использовать ArrayList и петлевую модификацию в первую очередь. В вашем случае вы можете скопировать оставшихся собак в новый список. 'n = ArrayList (dogList.size()); для {(d: dogList), если! d.getStatus(). equals ("ACCEPTED") n.add (d); } dogList = n; '. Это становится чище с потоками. – eckes

Смежные вопросы