//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();
}
}
}
}
大家好,我正在寻找一些关于我在迭代两个arraylists时遇到的异常的见解。我简化了上面的arraylists并删除了与问题无关的任何方法。
我在最后一个iterWords.remove()上得到了非法的例句。在外部while循环中我完成了iterWords.next(),所以iterWords.remove()应该看到要删除的东西。
我猜这是抛出异常,因为我从内部while循环调用iterWords.remove()。你认为情况可能如此吗?
感谢您提出的任何见解。
答案 0 :(得分:4)
首先,您应阅读并发布异常。
第二:在仅仅调用remove()
一次后,您多次调用next()
:与单词中未包含的字母一样多次。
第三:既然你总是使用相同的字母迭代器,那么一旦你完成了第一个单词,你就不再迭代这些字母。
所以你必须:
在外循环的每次迭代中重新创建字母迭代器。或者更好,只需使用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));