1

代码:

List<InData> inDataList= generateInRepo.getInList();
for(int i=0; i<inDataList.size();i++){
    if(somecondition){
        inDataList.remove(i);
    }
}

这里的问题是当一个项目被删除时,列表的大小会受到干扰并且代码会失败。如何以正确的方式实现此功能?

4

5 回答 5

4

您的代码的问题是您不应该i在删除后增加。

从您迭代的列表中删除的技巧是向后迭代它:

for( int i=inDataList.size()-1; i <= 0 ; i--) {
    if(somecondition){
        inDataList.remove(i);
    }
}

这样,您的下一次迭代将永远不会到达您已经访问过的索引。

于 2013-06-15T11:19:06.873 回答
1

Iterator.remove()在迭代期间是安全的:

List<InData> inDataList = generateInRepo.getInList();

Iterator<InData> it = inDataList.iterator();
while (it.hasNext()) {
   InData data = it.next();
   if (some condition) {
     it.remove();
   }
}
于 2013-06-15T11:16:15.123 回答
1

利用Iterator

List<InData> inDataList = generateInRepo.getInList();
for (Iterator<InData> iterator = inDataList.iterator(); iterator
        .hasNext();) {
    InData inData = (InData) iterator.next();
    if (somecondition) {
        iterator.remove();
    }
}
于 2013-06-15T11:19:43.263 回答
0

将“好”记录复制到另一个数组,然后替换原始记录。

于 2013-06-15T11:16:24.827 回答
0

使用Iterator并尝试从列表中删除元素。

for(Iterator<InData> itr = inDataList.iterator();itr.hasNext();itr.next();) {
    if(somecondition) {
        itr.remove();
    }
}
于 2013-06-15T11:19:23.883 回答