我使用Stack和StringBuilder类编写了用于字符串反转的代码。而且我注意到这段代码中的“ foreach”循环会生成java.util.ConcurrentModificationException,但通常的“ for”循环却不会。那为什么呢?
public static String reverse(String str)
{
Stack<Character> stack = new Stack<>();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++)
stack.push(str.toCharArray()[i]);
}
for (Character c: stack) // generates an exception
{
sb.append(stack.pop());
}
return sb.toString();
}
我期望字符串反转,但是发生了ConcurrentModificationException。
答案 0 :(得分:4)
您正在迭代堆栈时更改堆栈(stream_get_contects()
)。尝试使用其他循环:
stack.pop()
答案 1 :(得分:0)
ConcurrentModificationException当您尝试编辑要迭代的内容时发生。通过调用stack.pop()
,您将从当前循环的实体中删除一个实体。
相反,我建议您遍历堆栈直到其为空:
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
答案 2 :(得分:0)
for-each循环在后台使用迭代器,该迭代器检查“堆栈”中是否存在下一个元素,然后将“字符c”的值设置为该下一个元素。但是您不能在foreach期间更改“堆栈”的大小。通过调用stack.pop(),您违反了该规则。 代替for(Characater c:stack)使用:
while(!stack.empty()){
sb.append(stack.pop());
}
答案 3 :(得分:0)
function onEdit(e) {
var rg = e.range,
row = rg.rowStart,
col = rg.columnStart,
sht = rg.getSheet();
//exit code
if (col !== 2 || sht.getName() !== 'Sheet1' || row === 1) return;
//Calculate max value and add 1
rg.offset(0, -1, 1, 1).setValue(//setvalue in colA
rg
.offset(2 - row, -1, sht.getLastRow() - 1, 1) //get all of colA
.getValues()
.reduce(function(acc, curr) {//get max of colA
return Math.max(acc, Number(curr[0]));
}, 0) + 1
);
}
返回位于堆栈顶部的元素,然后删除该元素。在使用增强的for循环对其进行迭代时,您无法修改集合,因为如您所见,您将获得pop
。
一种方法可能是使用ConcurrentModificationException
循环并在堆栈上迭代直至耗尽:
while