2016-02-29 96 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