迭代器在调用 .next() 后抛出 illegalstateexception
Iterator throwing illegalstateexception after calling .next()
//This method compares two ArrayLists of strings and compares whether the words in one array list contain the letters in the other.
public static void remove()
{
//Create iterators for both stringList and letterList
Iterator<String> iterWords = stringList.iterator();
Iterator<String> iterLetters = letterList.iterator();
//First while loop will go over all strings in stringList via the iterWords iterator
while(iterWords.hasNext())
{
//iterWords now has a .next() call
String word = iterWords.next();
//Second while loop that should run over each letter in letterList and compare it to each word in stringList
while(iterLetters.hasNext())
{
//iterLetter now has a .next() call
String letter = iterLetters.next();
//if statement to remove the entry in stringList if it does not contain the current letter. It is this part that throws the illegalstateexception
if(word.contains(letter) == false)
{
//This is the line that is causing the illegalstateexceptions
iterWords.remove();
}
}
}
}
大家好,我正在寻找有关迭代两个数组列表时遇到的异常的一些见解。我已经简化了上面的数组列表并删除了与问题无关的所有方法。
我在最后一个 iterWords.remove() 上收到非法状态异常。在外部 while 循环中,我已经完成了 iterWords.next(),因此 iterWords.remove() 应该看到要删除的内容。
我猜这是抛出异常,因为我从内部 while 循环调用 iterWords.remove() 。你认为可能是这种情况吗?
感谢您提供任何见解。
首先,您应该阅读 post,异常。
其次:您在调用 next()
一次之后多次调用 remove()
:与单词中不包含的字母一样多。
第三:因为你总是使用同一个字母迭代器,所以一旦你完成了第一个单词,你就不会再对字母进行迭代了。
所以你必须:
- 删除单词后立即停止迭代字母
在外循环的每次迭代中重新创建字母迭代器。或者更好的是,只使用 foreach 循环:您不需要内部循环的迭代器。
如果您使用以下方法,您的代码会更简单、更易读且更安全:
for (Iterator<String> it: words; it.hasNext(); ) {
String word : it.next();
if (anyLetterNotInWord(letters, word) {
it.remove();
}
}
如果你在 Java 8,这可以减少到
words.removeIf(word -> anyLetterNotInWord(letters, word));
其中 anyLetterNotInWord()
可以定义为
return letters.stream().anyMatch(letter -> !word.contains(letter));
//This method compares two ArrayLists of strings and compares whether the words in one array list contain the letters in the other.
public static void remove()
{
//Create iterators for both stringList and letterList
Iterator<String> iterWords = stringList.iterator();
Iterator<String> iterLetters = letterList.iterator();
//First while loop will go over all strings in stringList via the iterWords iterator
while(iterWords.hasNext())
{
//iterWords now has a .next() call
String word = iterWords.next();
//Second while loop that should run over each letter in letterList and compare it to each word in stringList
while(iterLetters.hasNext())
{
//iterLetter now has a .next() call
String letter = iterLetters.next();
//if statement to remove the entry in stringList if it does not contain the current letter. It is this part that throws the illegalstateexception
if(word.contains(letter) == false)
{
//This is the line that is causing the illegalstateexceptions
iterWords.remove();
}
}
}
}
大家好,我正在寻找有关迭代两个数组列表时遇到的异常的一些见解。我已经简化了上面的数组列表并删除了与问题无关的所有方法。
我在最后一个 iterWords.remove() 上收到非法状态异常。在外部 while 循环中,我已经完成了 iterWords.next(),因此 iterWords.remove() 应该看到要删除的内容。
我猜这是抛出异常,因为我从内部 while 循环调用 iterWords.remove() 。你认为可能是这种情况吗?
感谢您提供任何见解。
首先,您应该阅读 post,异常。
其次:您在调用 next()
一次之后多次调用 remove()
:与单词中不包含的字母一样多。
第三:因为你总是使用同一个字母迭代器,所以一旦你完成了第一个单词,你就不会再对字母进行迭代了。
所以你必须:
- 删除单词后立即停止迭代字母
在外循环的每次迭代中重新创建字母迭代器。或者更好的是,只使用 foreach 循环:您不需要内部循环的迭代器。 如果您使用以下方法,您的代码会更简单、更易读且更安全:
for (Iterator<String> it: words; it.hasNext(); ) { String word : it.next(); if (anyLetterNotInWord(letters, word) { it.remove(); } }
如果你在 Java 8,这可以减少到
words.removeIf(word -> anyLetterNotInWord(letters, word));
其中 anyLetterNotInWord()
可以定义为
return letters.stream().anyMatch(letter -> !word.contains(letter));