我一直在使用我一直在开发的数据库函数依赖算法。我正在尝试根据晶格的当前级别和列标题列表(不是真正相关的)来计算函数依赖性。
我试图遍历一个字符串标题列表,以及循环遍历每个字符串的字符。使用此推理,我然后使用这些值从地图中的List<String>
值中删除字符串。 Map具有结构<String, List<String>>
,我想简单地从HashMap的List<String>
值中删除一个值。 colHeads
是List<String>
。
当我开始遍历列表时,我收到ConcurrentModificationException:
for (String x: level) {
for (char a : x.toCharArray()) {
if (cPlusHash.get(x).contains(Character.toString(a))) {
if (checkFD(Arrays.asList(x.replace("a", "")), Arrays.asList(Character.toString(a)))){
fds.add(x.replace("a", "") +", "+ a );
cPlusHash.remove(x, Character.toString(a));
for (char j : x.toCharArray()) {
if (colHeads.contains(Character.toString(j))) {
colHeads.remove(Character.toString(j));
}
}
for (String b : colHeads) {
if (cPlusHash.get(x).contains(b)) {
cPlusHash.remove(x, b);
}
}
}
}
}
我在这段代码的第一行抛出了错误。我很困惑,因为我实际上并没有尝试修改我正在迭代的List的值。
答案 0 :(得分:0)
在大多数情况下,在循环浏览时无法修改列表或映射。解决方案是获取Iterator,它提供remove()方法。这允许Iterator了解变化并且不会“丢失它”。
答案 1 :(得分:0)
您正在尝试修改地图cPlusHash
<String, List<String>>
,同时您正在阅读不允许的内容,并导致ConcurrentModificationException
。
https://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html
对于你的情况是一个单线程案例:
如果单个线程发出违反对象契约的一系列方法调用,则该对象可能会抛出此异常。例如,如果线程在使用失败快速迭代器迭代集合时直接修改集合,则迭代器将抛出此异常。