追加/削除を実行するためのピットと提案のリストをトラバースします
誰もがそのようなビジネスシナリオに遭遇したに違いないと思います。これで、学生のスコアのリストが表示されます。スコアが90を超えるリストを除外する必要があります。特定の人がこれを行います。コードは次のとおりです。
1.学生
public class Student {
private Integer score;
private String name;
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(Integer score, String name) {
super();
this.score = score;
this.name = name;
}
@Override
public String toString() {
return "Student [score=" + score + ", name=" + name + "]";
}
}
2.テストコード
public // 测试类
class Test {
public static void main(String[] args) {
// 需求:初始化一批学生的成绩,然后筛选出成绩大于90分的人
List<Student> students = new ArrayList<>();
students.add(new Student(54, "小明"));
students.add(new Student(98, "小红"));
students.add(new Student(67, "小刚"));
students.add(new Student(120, "小芳"));
students.add(new Student(99, "小陈"));
students.add(new Student(89, "小张"));
students.add(new Student(90, "小李"));
students.add(new Student(100, "小王"));
students.add(new Student(54, "小强"));
students.add(new Student(95, "小刘"));
for(Student student: students) {
if(student.getScore() < 90) {
students.remove(student);
}
}
System.out.println(students);
}
}
あなたはこれが大丈夫だと思わなければなりません。残念ながら、例外が報告されました!
Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(Unknown Source) at test01.java01.Test.main(Test.java:30)
どうしてこれなの?foreachループの最下層はイテレータに依存しているため、ここでremove / addメソッドを呼び出すと、現在のイテレータが直接変更され、クラス設計者はアクティブに同時例外をスローします。
3.解決策
3.1。イテレータのremove / addメソッドを使用して、操作を実装します
Iterator<Student> iterator = students.iterator();
while(iterator.hasNext()) {
if(iterator.next().getScore() < 90) {
iterator.remove();
}
}
3.2。for(i = 0; i <list.size(); i ++)を使用して操作を実現します
for(int i = 0; i < students.size(); i++) {
if(students.get(i).getScore() < 90) {
students.remove(i);
}
}
3.3。ストリームを使用したフィルターの実装
students = students.stream().filter(x -> x.getScore() >= 90).collect(Collectors.toList());
3.4。コレクションのremoveIf()メソッドを使用して
students.removeIf(x -> x.getScore() < 90);
通常の戻り結果:
[Student [score=98, name=小红], Student [score=120, name=小芳], Student [score=99, name=小陈], Student [score=90, name=小李], Student [score=100, name=小王], Student [score=95, name=小刘]]