迭代List时删除列表条目

时间:2015-01-06 14:32:53

标签: java

我有以下代码

final List<ItemDto> itemDtos = result.getResults();
List<String> deleteItemIds = new ArrayList<String>();

// remove items which have been deleted on the server
for(ItemDto itemDto : itemDtos) {
  if (itemDto.getIsRemoved()) {
    deleteItemIds.add(itemDto.getId());
    itemDtos.remove(itemDto);  //  TODO not sure if this works here
  }
}

我遍历itemDtos并在for循环的最后一个操作中删除ItemDto。我认为如果我在循环中不需要像itemDtos.indexOf(o)这样的东西,这是有效的。

我执行的代码是否正常工作?

编辑:这是第二种变体:

List<ItemDto> itemDtos = result.getResults();
List<ItemDto> tmpList = itemDtos;
List<String> deleteItemIds = new ArrayList<String>();

// remove items which have been deleted on the server
for(ItemDto itemDto : tmpList) {
  if (itemDto.getIsRemoved()) {
    deleteItemIds.add(itemDto.getId());
    itemDtos.remove(itemDto);  //  TODO not sure if this works here
  }
}

第二种变体更好吗?

2 个答案:

答案 0 :(得分:3)

要安全地从列表中删除元素,您应该使用列表的Iterator,如下所示:

for (Iterator<ItemDto> iterator = itemDtos.iterator(); iterator.hasNext()) {
    ItemDto itemDto = iterator.next();
    if (itemDto.getIsRemoved()) {
        deleteItemIds.add(itemDto.getId());
        iterator.remove(); 
    }
}

答案 1 :(得分:0)

在最后一个循环上执行循环时,无法从列表中删除对象。但是你可以使用迭代器。

    Iterator<ItemDto> iterator = arrayList.iterator();
    while (iterator.hasNext()) {
        ItemDto item = iterator.next();
        //Do your job
        iterator.remove();
    }

第二个解决方案可能是第一次循环找到要删除的所有元素,将它们存储在列表中,然后将它们从第一个列表中删除,感谢List.removeAll。