Recorra la lista de pozos y sugerencias para realizar agregar / quitar

Recorra la lista de pozos y sugerencias para realizar agregar / quitar

Creo que todo el mundo debe haberse encontrado con estos escenarios empresariales. Ahora hay una lista de calificaciones de los estudiantes. Debe filtrar la lista con calificaciones superiores a 90. Algunas personas harán esto. El código es el siguiente;

1. Estudiante

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. Código de prueba

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);
	}

}

Debes pensar que esto está bien. Desafortunadamente, se informó una excepción.
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)
¿Por qué es esto? Debido a que la capa inferior del bucle foreach se basa en iteradores, llamar al método remove / add aquí cambia directamente el iterador actual, por lo que el diseñador de clases lanza activamente una excepción concurrente.

3. Solución

3.1. Utilice el método eliminar / agregar del iterador para implementar la operación
Iterator<Student> iterator = students.iterator();
		while(iterator.hasNext()) {
    
    
			if(iterator.next().getScore() < 90) {
    
    
				iterator.remove();
			}
		}
3.2. Use for (i = 0; i <list.size (); i ++) para realizar la operación
for(int i = 0; i < students.size(); i++) {
    
    
			if(students.get(i).getScore() < 90) {
    
    
				students.remove(i);
			}
		}
3.3. Implementación de filtro usando stream
students = students.stream().filter(x -> x.getScore() >= 90).collect(Collectors.toList());
3.4. Utilice el método removeIf () de Colección para lograr
students.removeIf(x -> x.getScore() < 90);

Resultado de devolución normal:

[Student [score=98, name=小红], Student [score=120, name=小芳], Student [score=99, name=小陈], Student [score=90, name=小李], Student [score=100, name=小王], Student [score=95, name=小刘]]

Supongo que te gusta

Origin blog.csdn.net/m0_53085735/article/details/112989012
Recomendado
Clasificación