对于Java作业,我们被分配来初始化包含字典单词的字符串的ArrayList。如果单词不是我们生成的长度,则将它们从ArrayList中删除。以下代码不起作用。
public static int randLength() {
int range=(RAND_MAX-RAND_MIN)+1;
int randomNum=(int)(Math.random()*range)+RAND_MIN;
return randomNum;
}
此功能正常工作。
int randomLength=randLength();
System.out.println(randomLength);
for(int i=0;i<dictionaryList.size()-1;i++) {
if(dictionaryList.get(i).length()!=randomLength) {
System.out.println("The lucky word is " + dictionaryList.get(i));
dictionaryList.remove(i);
}
}
但是,事实并非如此。使用单词的文本文件初始化dictionaryList。我的是 “苹果” “啤酒” “查理” “小狗” “象” “愤怒” 在某些情况下,上面的代码确实删除了不是randomLength值的单词。但是,它并不能全部删除。任何帮助将不胜感激。
答案 0 :(得分:0)
从ArrayList中删除一项时,您将跳过列表中的下一项,而不检查是否应删除它。
例如,如果您列出的是“苹果”,“啤酒”,“查理”,“狗”,“原子”,“大象”,并且您应删除的单词长度的随机数为4(啤酒,狗和原子都应删除),“原子”将不会删除。当for循环运行时,其运行方式如下:
i:0,单词:“ apples”,未删除
i:1,单词:“啤酒”,已删除
i:2,单词:“狗”,已删除
i:3,单词:“ elephant”,未删除。
如果删除了一个元素,则必须将i减1,以便检查所有元素。您可以将i--
放在dictionaryList.remove(i)
之后的行中
之所以发生这种情况,是因为当从ArrayList中删除一个元素时,其后的所有元素都向下移动以填充空间,这与Array不同。
另外,您的for循环应使用i<dictionaryList.size()
而不是i<dictionaryList.size()-1
来检查最后一个元素。
您还可以使用Iterator遍历ArrayList,但是如果您还没有教过它,则可能不想使用它。
答案 1 :(得分:0)
最好使用迭代器删除元素,以避免并发修改异常。
long
答案 2 :(得分:0)
Java Collection类是快速失败的,这意味着如果在使用迭代器遍历某些线程时更改Collection,则iterator.next()将抛出ConcurrentModificationException。
ie:通常不允许一个线程修改Collection,而另一个线程对其进行迭代
在多线程环境中避免ConcurrentModificationException
请考虑以下示例,该示例很快就会失败
使用ConcurrentHashMap: