gpt4 book ai didi

java - 在迭代期间从 ArrayList 中删除多个项目

转载 作者:搜寻专家 更新时间:2023-10-31 08:21:54 24 4
gpt4 key购买 nike

在使用迭代器遍历 ArrayList 时从 ArrayList 中删除多个项目是否安全?

Iterator<String> iterator = nameList.iterator();
while(iterator.hasNext()){
String s = iterator.next();
List<String> list = work(s);
for (String s1 : list) {
nameList.remove(s1);
}
}

work() 方法会在 while 循环运行期间返回应从 nameList 中删除的名称列表。

最佳答案

不,它不安全,可以抛出 ConcurrentModificationException .您可以在临时 List 中收集所有要删除的元素, 然后调用 list.removeAll(tmpList)在 while 循环之后执行删除操作。

Iterator<String> iterator = nameList.iterator();
List<String> removed = new ArrayList<>();
while(iterator.hasNext()){
String s = iterator.next();
removed.addAll(work(s));
}
list.removeAll(removed);

我意识到这可能效率较低,因为您可能正在调用 work(s)String应该从 List 中删除更早。这可以通过更改 tempList 来改善。到 Set , 并且只调用 work(s)对于 String它不在 Set 中:

Iterator<String> iterator = nameList.iterator();
Set<String> removed = new HashSet<>();
while(iterator.hasNext()){
String s = iterator.next();
if (!removed.contains(s)) {
removed.addAll(work(s));
}
}
list.removeAll(removed);

关于java - 在迭代期间从 ArrayList 中删除多个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48783589/

24 4 0