else if语句可以按预期工作,除非运行完成后出现此ConcurrentModificationException错误。我认为可能是每个循环的原因,但我不太确定。
else if(input == 2){
System.out.println("Enter a period");
int periodInput = sc.nextInt();
System.out.println("Enter the students name (Dont include a space between the first and last name)" );
String nameInput = sc.next();
if(periodInput == 3){
for(Student a: period3){
if(a.getName().equals(nameInput)){
period3.remove(a);
System.out.println(period3);
}else{
System.out.println("No student was found with this name");
}
}
}
答案 0 :(得分:0)
迭代时不能修改集合的结构。您应该更喜欢使用Iterator
。使用类似这样的内容:
for(Iterator<Student> stItr = period3.iterator(); stItr.hashNext();){
Student a = stItr.next();
if(a.getName().equals(nameInput)){
stItr.remove();
System.out.println(period3);
}else{
System.out.println("No student was found with this name");
}
}
答案 1 :(得分:0)
编辑:我想出了如何使用for循环而不是每个循环来解决我的问题
if(periodInput == 3) {
for(int i=0; i<=period3.size()-1; i++) {
if(period3.get(i).getName().equals(nameInput)) {
period3.remove(i);
System.out.println(period3);
break;
}
}
}
else if(periodInput == 5) {
for(int i=0; i<=period5.size()-1; i++) {
if(period5.get(i).getName().equals(nameInput)) {
period5.remove(i);
System.out.println(period5);
break;
}
}
}
答案 2 :(得分:0)
如先前的回答所述,Java不允许在for-each循环中对列表进行并发修改。您将继续使用的解决方案将起作用,因为您没有在列表本身上循环,而是使用整数进行循环,并且在每次迭代之后,您都在检查数组的大小(每次删除后都会对其进行修改),因此循环知道去除。您也可以尝试以下方法:
else if(input == 2){
List<Student> removalList = new ArrayList<Student>();
System.out.println("Enter a period");
int periodInput = sc.nextInt();
System.out.println("Enter the students name (Dont include a space between the first and last name)" );
String nameInput = sc.next();
if(periodInput == 3){
for(Student a: period3){
if(a.getName().equals(nameInput)){
removalList.add(a);
}
}
if(!removalList.isEmpty()){
for(Student stu: removalList){
period3.remove(stu);
}
System.out.println(period3);
} else{
System.out.println("No student was found with this name");
}
}
答案 3 :(得分:0)
如下定义您的“ period03”,
List<Student> period3 = new CopyOnWriteArrayList<Student>();
如果有任何问题,请通知我。
答案 4 :(得分:0)
您无法修改要迭代的集合(迭代器已损坏)。想象一下,如果您要按索引从i = 0迭代到size()并在此方式更新集合...
使用过滤器而不是for循环(假设period3是一个集合-列表)
更改此
for(Student a: period3){
if(a.getName().equals(nameInput)){
period3.remove(a);
System.out.println(period3);
}else{
System.out.println("No student was found with this name");
}
}
到
period3 = period3.stream().filter(student -> !student.getName().equals(nameInput)).collect(toList());
如果不是Java 8+选项,则-创建结果集合并向其中添加合格的项,而不是对原始列表进行变异。