【问题标题】:Using iterator in loop without causing any exceptions在循环中使用迭代器而不会导致任何异常
【发布时间】:2020-08-19 05:36:41
【问题描述】:

我使用迭代器类来解决一个问题。 我认为 HashSet 的 iterator() 方法返回其迭代器的集合。 但是每当我运行这段代码(尤其是第 5 行)时,它就会发生 ConcurrentModificationException,即使我已经检查过迭代器是否有下一个元素。

抱歉我的英语不好,但我真的很想找出我的代码有什么问题并解决问题。

for (int i = 0; i < N; i++) {
    int input = scan.nextInt();
    iterator = set.iterator();
    while (iterator.hasNext()) {
        int num = iterator.next();
        if (!set.contains(num + input)) set.add(num + input);
    }
}

【问题讨论】:

  • 在创建使用的Iterator 后,您不能修改Collection,除非通过Iterator#remove(),否则(很可能)不会获得ConcurrentModificationException
  • 关于编码风格的一个提示:将set.add(num + input);单独放在一行。它不仅更具可读性,而且更适合调试,因为 Java 会告诉您正是该语句导致了异常。
  • @Slaw 感谢您的帮助。现在我明白了我的代码有什么问题。我应该尝试其他方法来解决这个问题。
  • @RalfKleberhoff 我接受你的建议。谢谢:D

标签: java iterator


【解决方案1】:

将添加存储在本地集/列表中。

整体迭代后,全部添加即可

Set toAdd = new HashSet();
for (int i = 0; i < N; i++) {
    int input = scan.nextInt();
    iterator = set.iterator();
    toAdd.clear();
    while (iterator.hasNext()) {
        int num = iterator.next();
        if (!set.contains(num + input)) toAdd.add(num + input);
    }
    set.addAll(toAdd);
}

【讨论】:

  • 谢谢丹尼尔。我尝试了这段代码,但没有发生异常。但是我担心当N 很大时,addAll() 方法可能需要很长时间。
  • 我猜如果 N 变得那么大,你的函数通常也会很慢,因为你连续调用一个插入函数。您可能已经查看了带有排序列表和 for 循环的算法
  • for(int i = 0; i &lt; N; i++) { int input = scan.nextInt(); for(int num: new ArrayList&lt;&gt;(set)) set.add(num + input); },跳过所有多余的工作。
猜你喜欢
  • 2020-05-20
  • 1970-01-01
  • 2013-08-04
  • 2017-01-09
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多