您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页Java 从集合移除元素

Java 从集合移除元素

来源:化拓教育网


常见错误代码

1. 在foreach遍历集合的同时删除集合中的元素

代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class User{
    private String name;
    User(String name){
        this.name=name;
    }
    public String getName() {
        return name;
    }
}
public class Test {
    public static void main(String[] args) {
        List<User> users = new ArrayList<>();
        User a = new User("A");
        User b = new User("B");
        User c = new User("C");
        User[] u = {a, b, c};
        users.addAll(List.of(u));
        Collections.addAll(users, u);
        users.forEach(i -> System.out.println(i.getName()));
        for (User i : users){    //代码重点!!
            if (i.getName() == "B"){
                users.remove(i);
            }
        }
    }
}

执行结果:报错

A
B
C
A
B
C
Exception in thread "main" java.util.ConcurrentModificationException
	at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013)
	at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967)
	at Test.main(Test.java:23)

Process finished with exit code 1

2. 使用基本for循环

代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class User{
    private String name;
    User(String name){
        this.name=name;
    }
    public String getName() {
        return name;
    }
}
public class Test {
    public static void main(String[] args) {
        List<User> users = new ArrayList<>();
        User a = new User("A");
        User b = new User("B");
        User c = new User("C");
        User[] u = {a, b, c};
        users.addAll(List.of(u));
        users.add(1,b);
        users.forEach(i -> System.out.println(i.getName()));
        for (int i=0;i<users.size();i++){    //代码重点!!
            if (users.get(i).getName() == "B"){
                users.remove(i);
            }
        }
        System.out.println("______");
        users.forEach(i -> System.out.println(i.getName()));
    }
}

执行结果:虽然没有报错,但也没有将name为B的对象全部删除

A
B
B
C
______
A
B
C

Process finished with exit code 0

正确代码(示例)

1. 通过迭代器实现可移除的遍历

代码:

import java.util.*;
class User{
    private String name;
    User(String name){
        this.name=name;
    }
    public String getName() {
        return name;
    }
}
public class Test {
    public static void main(String[] args) {
        List<User> users = new ArrayList<>();
        User a = new User("A");
        User b = new User("B");
        User c = new User("C");
        User[] u = {a, b, c};
        users.addAll(List.of(u));
        users.add(1,new User("B"));
        users.forEach(i -> System.out.println(i.getName()));
        Iterator<User> it = users.iterator();    //代码重点!!
        while (it.hasNext()){    
            User i = it.next();
            if (i.getName() == "B"){
                it.remove();
            }
        }
        System.out.println("------");
        users.forEach(i -> System.out.println(i.getName()));
    }
}

执行结果:

A
B
B
C
------
A
C

Process finished with exit code 0

2. 基于集合stream流,结合Lambda表达式实现

代码:

import java.util.*;
import java.util.stream.*;

class User{
    private String name;
    User(String name){
        this.name=name;
    }
    public String getName() {
        return name;
    }
}
public class Test {
    public static void main(String[] args) {
        List<User> users = new ArrayList<>();
        User a = new User("A");
        User b = new User("B");
        User c = new User("C");
        User[] u = {a, b, c};
        users.addAll(List.of(u));
        users.add(1,new User("B"));
        users.forEach(i -> System.out.println(i.getName()));
        users = users.stream().filter(i -> i.getName() != "B").collect(Collectors.toList());  //代码重点!!
        System.out.println("------");
        users.forEach(i -> System.out.println(i.getName()));
    }
}

执行结果:

A
B
B
C
------
A
C

Process finished with exit code 0

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务