【发布时间】:2021-03-22 21:32:06
【问题描述】:
我有一个包含整数的 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,我认为这是由于我修改了循环头中使用的集合造成的。
如何在循环时修改集合的内容?我尝试以几种不同的方式来回复制集合,但代码总是失败并显示相同的错误消息。我不能在循环时修改集合,但是修改集合是这个循环的全部目的。//
【问题讨论】:
-
你期待什么输出?您是否从此方法返回值?还是期望结果在集合中?
-
您应该使用实际的迭代器而不是 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) 循环直到 TreeSet 具有由 (1) 决定的元素数量。这些元素决定插入点的位置并且是随机的。同样,字符串长度用于限制随机数的值。在此之后我执行这个循环。这个 +1 的原因是为了防止点彼此相邻。