【问题标题】:Not allowed to manipulate TreeSet in for-loop不允许在 for 循环中操作 TreeSet
【发布时间】:2021-03-22 21:32:06
【问题描述】:

我有一个包含整数的 TreeSet。我遍历这个集合并一一“消耗”整数。在每个循环中,我需要将剩余的未消耗整数增加 1。

例如,我从一个包含四个值的集合开始:2, 3, 5, 8。在我使用2 的第一个循环之后,结果应该是包含此内容4, 6 , 9 的集合。在第二个循环之后,消耗了4,它应该是7, 10,依此类推。

  • 我不需要在消耗完最后一个值后将其增加一步(但如果是也可以)。
  • 如果消耗的值保留在集合中是可以的,无论它们是原始值还是增加值都没有关系。换句话说,在第二个循环之后,如果该集合包含2, 3, 7, 102, 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,我认为这是由于我修改了循环头中使用的集合造成的。

如何在循环时修改集合的内容?我尝试以几种不同的方式来回复制集合,但代码总是失败并显示相同的错误消息。我不能在循环时修改集合,但是修改集合是这个循环的全部目的。//

【问题讨论】:

  • 你期待什么输出?您是否从此方法返回值?还是期望结果在集合中?
  • 您应该使用实际的迭代器而不是 for-each 循环。
  • 我的最终目标是在字符串中插入随机数量的点,根据一定的规则:(1)第一个和最后一个字符不能是点。 (2) 不允许连续两个点。换句话说,如果我有一个六个字符串ABCDEF,则允许的最大点数为 5(但 0 到 4 也可以)。以下结果有效A.B.C.D.E.FAB.CDEFAB.C.D.EF,而这两个无效.AB.C.DEFA.BCD.EF.
  • 这能回答你的问题吗? Remove elements from collection while iterating
  • 我的一般算法如下所示: (1) 字符串长度 -1 用于获取应使用的点数的随机值。 (2) 循环直到 TreeSet 具有由 (1) 决定的元素数量。这些元素决定插入点的位置并且是随机的。同样,字符串长度用于限制随机数的值。在此之后我执行这个循环。这个 +1 的原因是为了防止点彼此相邻。

标签: java loops foreach set


【解决方案1】:

除了允许的规定外,您不能在迭代期间修改数据结构。对于迭代器,这只是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);
}

【讨论】:

    猜你喜欢
    • 2012-05-14
    • 1970-01-01
    • 2015-01-21
    • 2018-01-16
    • 2014-05-31
    • 2011-02-06
    • 2021-08-08
    • 1970-01-01
    • 2017-05-13
    相关资源
    最近更新 更多