我有以下代码
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
}
}
第二种变体更好吗?
答案 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。