2016-02-29 64 views
1

我正在执行for-loop内的逻辑,它将从狗窝对象中删除状态为“ACCEPTED”的任何狗对象。删除arrayList中的项目:试图从不存在的索引中删除?

请注意,一个狗窝可以有一个列表许多狗。

循环:

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,OBJ 3

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 
} 

预期的那样,在列表中删除所有的项目,所以我删除后加我 - 方法

+1

这似乎工作,这是一个合适的解决方案或只是一个解决方法? – java123999

+0

例如,如果列表中有5个对象,并且您删除了第3个对象。现在索引改变了,并且以前的第4个对象的索引现在是2(列表中的第3个对象)。所以我认为这是一个合适的解决方案。有关详细信息,我将编辑答案并尝试提供更多示例 –

+0

正确的解决方案是首先不要使用ArrayList和循环修改。在你的情况下,你可以复制剩余的狗到一个新的列表。 'n = ArrayList(dogList.size());对于{(d:dogList)if!d.getStatus()。equals(“ACCEPTED”)n.add(d); } dogList = n;'。这与溪流变得更清洁。 – eckes