gpt4 book ai didi

java - 不允许在 for 循环中操作 TreeSet

转载 作者:行者123 更新时间:2023-12-04 08:26:07 26 4
gpt4 key购买 nike

我有一个包含整数的 TreeSet。我遍历这个集合并一个一个“消耗”整数。在每个循环中,我需要用 1 增加剩余的未使用整数。
例如,我从一个包含四个值的集合开始:2, 3, 5, 8 .在我消耗 2 的第一个循环之后结果应该是包含此内容的集合 4, 6 , 9 .在第二个循环之后,其中 4被消耗了,应该是7, 10等等。

  • 我不需要在消耗完最后一个值后将其增加一步(但如果是这样也可以)。
  • 如果消耗的值保留在集合中就可以了,它们是原始值还是增加值都没有关系。换句话说,在第二次循环之后,如果集合包含 2, 3, 7, 10 就可以了或 2, 4, 7, 10或只是 7, 10 . (此循环后该集合将被丢弃)

  • 这是我的代码
        for (Integer i : positionSet) {
    TreeSet <Integer> tmpSet = new TreeSet<>();
    //use i for something
    //positionSet.remove(i); //I tried with this both on and off, but it made no difference
    for (Integer j : positionSet) {
    tmpSet.add(j + 1);
    }
    positionSet.clear();
    positionSet.addAll(tmpSet);
    }
    它在第二轮崩溃了 java.util.ConcurrentModificationException ,我认为这是由我修改循环头中使用的集合引起的。
    如何在循环时修改集合的内容? 我尝试以几种不同的方式来回复制该集合,但代码不断失败并显示相同的错误消息。我不能在循环时修改集合,但是修改集合是这个循环的全部目的。//

    最佳答案

    除了允许的规定外,您不能在迭代期间修改数据结构。对于迭代器,这只是 Iterator.remove() ,但是 for-each 没有这样的规定,也不能影响其他元素。
    您能做的最好的事情是创建一个独立于数据结构的 while 循环:

    while (!positionSet.isEmpty()) {
    Integer i = <take one element out of positionSet somehow>;
    //positionSet.remove(i); //remove if the previous line didn't already remove it

    //use i for something
    TreeSet <Integer> tmpSet = new TreeSet<>();
    for (Integer j : positionSet) {
    tmpSet.add(j + 1);
    }
    positionSet.clear();
    positionSet.addAll(tmpSet);
    }

    关于java - 不允许在 for 循环中操作 TreeSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65251827/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com