Java 不允许在for循环中操纵树集

Java 不允许在for循环中操纵树集,java,loops,foreach,set,Java,Loops,Foreach,Set,我有一个包含整数的树集。我循环遍历这个集合,并逐个“使用”整数。在每个循环中,我需要将剩余的未求和整数增加1 例如,我从一个有四个值的集合开始:2、3、5、8。在我使用2的第一个循环之后,结果应该是一个包含该内容的集合4、6、9。在第二个循环之后,如果消耗了4,则应为7、10,依此类推 我不需要在消耗完最后一个值后再增加一步(但如果是的话就可以了) 如果消耗的值仍保留在集合中,这是正常的,而不管它们是在原始值还是增加值。换句话说,在第二次循环之后,如果集合包含2,3,7,10或2,4,7,10

我有一个包含整数的树集。我循环遍历这个集合,并逐个“使用”整数。在每个循环中,我需要将剩余的未求和整数增加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);
    }
for(整数i:positionSet){
TreeSet tmpSet=新树集();
//用我做某事
//positionSet.remove(i);//我试着打开和关闭它,但没有任何区别
用于(整数j:位置集){
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);
}
while(!positionSet.isEmpty()){
整数i=;
//positionSet.remove(i);//如果前一行尚未删除它,则删除
//用我做某事
TreeSet tmpSet=新树集();
用于(整数j:位置集){
tmpSet.add(j+1);
}
positionSet.clear();
positionSet.addAll(tmpSet);
}

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