private int checkLevel(String bigWord, Collection<String> dict, MinMax minMax)
{
/*value initialised to losing*/
int value = 0;
if (minMax == MinMax.MIN) value = 1;
else value = -1;
boolean go = true;
Iterator<String> iter = dict.iterator();
while(iter.hasNext())
{
String str = iter.next();
Collection<Integer> inds = naiveStringSearch(bigWord, str);
if(inds.isEmpty())
{
iter.remove();
}
for (Integer i : inds)
{
MinMax passin = minMax.MIN;
if (minMax == MinMax.MIN) passin = minMax.MAX;
int value2 = checkLevel(removeWord(bigWord, str, i), dict, passin);
if (value2 == -1 && minMax == minMax.MIN)
{
value = -1;
go = false;
}
if (value2 == 1 && minMax == minMax.MAX)
{
value = 1;
go = false;
}
}
if (go == false) break;
}
return value;
}
错误:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:810)
at java.util.HashMap$KeyIterator.next(HashMap.java:845)
at aStringGame.Main.checkLevel(Main.java:67)
at aStringGame.Main.test(Main.java:117)
at aStringGame.Main.main(Main.java:137)
这是什么问题
某处正在修改dict
。我怀疑它可能在此调用内发生:
int value2 = checkLevel(removeWord(bigWord, str, i), dict, passin);
^^^^
编辑 基本上,发生的是通过 另一个 迭代器进行的递归checkLevel()
修改。这使得外部迭代器的故障快速行为得以解决。dict
__
问题内容: 我正在尝试从中删除一些元素,但即使是最简单的示例,如本答案或本示例中的示例,也将无法使用。 使用法线代替a 并没有帮助。我想念什么?我正在使用Java 7。 问题答案: 返回由原始数组支持的列表。您对列表所做的更改也将反映在您传入的数组中。由于您无法向数组添加或删除元素,因此对列表进行这种创建也是不可能的,这就是调用失败的原因。如果要能够动态添加和删除元素,则需要使用(,等)的不同实现
通常,您需要遍历集合中的元素。 例如,您可能希望显示每个元素。 最简单的方法是使用迭代器,它是一个实现Iterator或ListIterator接口的对象。 Iterator使您可以循环访问集合,获取或删除元素。 ListIterator扩展Iterator以允许列表的双向遍历和元素的修改。 在通过迭代器访问集合之前,必须先获取一个集合。 每个集合类都提供了一个iterator()方法,该方法将迭
问题内容: 我使用迭代器遍历一个集合,如下所示: 但是在下面的行中,我得到了ConcurrentModificationException 当我不进行任何更改时,为什么会发生这种情况? 非常感谢 编辑-堆栈跟踪: 问题答案: 您必须修改列表之一: 在方法中的迭代器内部,而无需使用迭代器上的或方法;要么 在另一个线程中 因此,您的例外是预期的行为。从该文档,如果你有一个线程遍历列表: 如果在创建迭代
我对Java还很陌生,今天我试图理解迭代器的使用。 所以我有几个问题: > 为什么我需要实现Iterable呢?它只提供了一个为集合创建新迭代器的方法,但如果我想获取所有元素,我也可以使用普通的或增强的for循环。我已经读过这个问题:可迭代接口用于什么?还有更多,但他们只是说它允许你遍历所有元素,这又回到了我的问题。 如果我实现了Iterable,我也应该实现迭代器吗 因为这一个实际上提供了可用于
问题内容: 有什么不同之处与使得迭代器不会引发异常而引发异常?最后,两者都在修改集合大小。 请在这里忽略多线程。我只是在谈论一个for-each循环和一个迭代器循环。据我所知,for-each循环仅在内部创建迭代器。 我很困惑。 问题答案: 不会抛出,因为这是在迭代时修改集合的 允许 方式。这是什么的Javadoc的说: 从基础集合中移除此迭代器返回的最后一个元素(可选操作)。每次调用next()