Java 从ArrayList中删除元素

Java 从ArrayList中删除元素,java,random,arraylist,Java,Random,Arraylist,在这个程序中,我保留了一个决斗者列表,当他们的随机int=0时,杀死最好的决斗者。 我在接近底部的循环中遇到问题,并出现以下错误: Exception in thread "main" java.util.ConcurrentModificationException at java.util.AbstractList$Itr.checkForComodification(Unknown Source) at java.util.AbstractList$Itr.next(Unknown Sou

在这个程序中,我保留了一个决斗者列表,当他们的随机int=0时,杀死最好的决斗者。 我在接近底部的循环中遇到问题,并出现以下错误:

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at java.util.AbstractList$Itr.next(Unknown Source)
at Duelist.main(Duelist.java:74)
代码

导入java.util.array;
导入java.util.Random;
导入java.util.ArrayList;
导入java.util.Collections;
公共类Duelist实现了可比较的{
私有字符串名称;
私人机会;
私有布尔活着;
公共决斗列表(字符串决斗列表名称,整数){
活着=真;
name=duelistName;
偶然性=偶然性;
}
公共字符串getName(){
返回名称;
}
public int getChance(){
回归机会;
}
公共布尔getLife(){
活着回来;
}
公共空杀(){
活着=假;
}
public int compareTo(对象另一个DueList)抛出ClassCastException{
如果(!(Duelist的另一个Duelist实例))
抛出新的ClassCastException(“应为Duelist对象”);
int anotherDuelistChance=((Duelist)anotherDuelist.getChance();
返回此.chance-另一个DuelistChance;
}
公共静态void main(字符串[]args){
ArrayList duelers=新的ArrayList(5);
//ArrayList personToKill=新的ArrayList(5);
ArrayList秩=新的ArrayList(5);
随机生成器=新随机();
Duelist Antoine=新的Duelist(“Antoine”,3);
决斗名单方济各=新决斗名单(“方济各”,6);
决斗者朱丽叶=新的决斗者(“朱丽叶”,1);
决斗者。添加(安托万);决斗者。添加(弗朗西斯);决斗者。添加(朱丽叶);
//系统输出打印LN(duelers);
//用于(Duelist元素:duelers){
//System.out.println(element.getName());
//System.out.println(element.getChance());
//}
集合。排序(决斗者);
收藏。反面(决斗者);
//用于(Duelist元素:duelers){
//System.out.println(element.getName());
//System.out.println(element.getChance());
//}
while(duelers.size()>1){
用于(Duelist元素:duelers){
System.out.println(element.getName());
System.out.println(“Chance:+element.getChance());
int randomInt=generator.nextInt(element.getChance());
System.out.println(“随机整数”+randomInt);
//如果randomInt等于0,则销毁目标
if(randomInt==0){
//检查以确保最佳决斗名单不会自杀
if(element.equals(duelers.get(duelers.size()-1))){
System.out.println(“LASTDUDE”);
duelest bestDueler=duelers.get(duelers.size()-2);
最好的决斗者;
添加(元素);
决斗者。移除(最佳决斗者);
}
否则{
系统输出打印项次(“Killshot”);
duelest bestDueler=duelers.get(duelers.size()-1);
最好的决斗者;
添加(元素);
决斗者。移除(最佳决斗者);
}
}
}
}
系统输出打印LN(duelers);
}
}
当您在这个块中时,您正在对duelers列表进行迭代,这意味着您不能在不引起错误的情况下更改列表,除非您使用迭代器的方法

这里的问题是,您没有访问迭代器的权限。因此,您必须使用迭代器将foreach循环更改为while循环:

Iterator<Duelist> it = duelists.iterator();
while(it.hasNext()){
    Duelist element = it.next();
    // continue as before

或者:您可以创建列表的副本以进行迭代。这是对内存的浪费(还有代码的味道),但是如果你的应用程序很小,它不会有太大的区别,而且你只需要最少的重写

for(Duelist element : new ArrayList<Duelist>(duelers)){
// continue as above
for(Duelist元素:新的ArrayList(duelers)){
//继续如上所述
当您在这个块中时,您正在对duelers列表进行迭代,这意味着您不能在不引起错误的情况下更改列表,除非您使用迭代器的方法

这里的问题是,您没有访问迭代器的权限。因此,您必须使用迭代器将foreach循环更改为while循环:

Iterator<Duelist> it = duelists.iterator();
while(it.hasNext()){
    Duelist element = it.next();
    // continue as before

或者:您可以创建列表副本进行迭代。这是一种内存浪费(和代码气味),但如果您的应用程序很小,则不会产生太大的差异,并且您只需要最少的重写

for(Duelist element : new ArrayList<Duelist>(duelers)){
// continue as above
for(Duelist元素:新的ArrayList(duelers)){
//继续如上所述

问题在于这行
决斗者。移除(最佳决斗者);

在对列表进行迭代且不使用迭代器时,不应修改列表
通过
为(Duelist元素:duelers)


明确使用迭代器,即
duelers.listIterator()
,并使用
iterator
remove
,问题在于这行
duelers.remove(bestDueler);

在对列表进行迭代且不使用迭代器时,不应修改列表
通过
为(Duelist元素:duelers)


明确使用迭代器,即
duelers.listIterator()
,并改用
iterator
remove

您不能修改foreach循环中的集合,而是使用迭代器
当您想要删除某些内容时,请使用迭代器。remove():

您不能在foreach循环中修改集合,而应使用迭代器 如果要删除某些内容,请使用Iterator.remove():

请发布一个简短的示例,没有所有注释掉的行,没有多个空白行的大量区域,有适当的缩进。我相信你可以给出一个示例,它占用的空间非常小,在中查看时甚至不需要滚动,所以…可能重复请发布一个简短的示例,没有所有注释掉的行行,没有多个空白行的大量区域,具有适当的缩进。我相信您可以想出一个示例,它占用的空间非常小,在中查看时甚至不需要滚动,因此…可能的副本应该使用for循环wi
duelers.remove(element);
// the problem here is: you can only remove the current element,
// so you'll have to re-think some of your code
it.remove();
for(Duelist element : new ArrayList<Duelist>(duelers)){
// continue as above