2011-09-02 40 views
0

我为有限的标题道歉,但我不知道如何完全描述这个问题。我有一个for循环遍历包含一个对象的arrayList。其中一种对象方法是在不同时间点设置的布尔值。 for循环的要点是通过arrayList并将每个包含布尔值的项目移除为false。For Array on ArrayList异常

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异常。有任何想法吗?另外,这是做我想做的最好的方法吗?

回答

1

您应该向后循环,以便不使用在删除项目后出现的标记。

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

} 

或者,你可以递减i使用一个索引,并摆脱len可变的,这样的结束条件使用的实际长度。

+0

我怎么会去向后循环?对不起...... – ryandlf

2

您可以切换到时:

if(! arrayList.isEmpty()){ 
    int i = 0; 
    while(i < arrayList.size()) { 
     if(! arrayList.get(i).isStartTimer()){ 
      arrayList.remove(i); 
      continue; // skip i++ 
     } 
     i++; 
    } 
} 
+0

这也可以,谢谢。尽管我已经接受了先前的答案,但我也喜欢这种方法。 – ryandlf