ArrayList和HashMap的遍历选择删除,集合的迭代删除



ArrayList的遍历删除

ArrayList实现了Collection接口,Collection又继承了Iterable接口,所以Collection接口下的所有实现类都可以通过iterator()方法创建迭代器对象
在这里插入图片描述


ArrayList初始化

        ArrayList<Student> students = new ArrayList<>();
        students.add(new Student("张三", 18));
        students.add(new Student("李四", 20));
        students.add(new Student("王五", 20));

方法1

通过普通for循环遍历索引删除:
        for (int i = 0; i < students.size(); i++) {
            if (students.get(i).getAge() == 20){  //获得当前下标元素
                students.remove(i);               //通过下标移除元素
                i--;                              //移除元素后,后面元素自动前移,迭代器i--;
            }
        }
Student{name='张三', age=18}

Process finished with exit code 0

注意:
如果循环从0开始,删除元素后,后面元素会自动前移,i 需要-1;
如果从后往前开始循环,正常即可。


方法2

使用iterator()迭代器进行遍历删除:	
        Iterator<Student> it = students.iterator();
        while (it.hasNext()){
            if(it.next().getAge()==20){
                it.remove();
            }
        }
Student{name='张三', age=18}

Process finished with exit code 0


方法3(常用方法,推荐)

在JDK1.8之后允许使用Lambda表达式实现。
推荐使用removeIf()方法,让代码更加优雅。

        ArrayList<Student> students = new ArrayList<>();
        students.add(new Student("张三", 18));
        students.add(new Student("李四", 20));
        students.add(new Student("王五", 20));
        students.removeIf(entry->entry.getAge()==20);   //遍历寻找删除
        students.forEach(System.out::println);          //遍历打印
Student{name='张三', age=18}

Process finished with exit code 0

removeIf()的内部实现用的就是迭代器



HashMap的遍历删除

HashMap并不是接口Collection下的实现类,不能直接获取Iteraotr对象。

初始化HashMap:
        HashMap<Integer, String> testHashMap = new HashMap<>();
        testHashMap.put(1, "AAA");
        testHashMap.put(4,"AAA");
        testHashMap.put(2, "Two");
        testHashMap.put(3, "Three");

方法1

使用entrySet或者keySet,用List记录需要删除的元素key,然后通过remove(key)方法删除

        ArrayList<Integer> removeKey = new ArrayList<>();           //创建List集合接收需要删除元素的key
        for (Map.Entry<Integer,String> e:testHashMap.entrySet()){   //遍历map的entrySet    
            if(e.getValue().equals("AAA")){                         //判断需要删除的元素
                removeKey.add(e.getKey());                          //将需要删除的元素的key添加进List中
            }
        }
        removeKey.forEach(testHashMap::remove);           //通过List中的key删除,使用的是remove(key)方法
        System.out.println(testHashMap);                  //打印
{2=Two, 3=Three}

Process finished with exit code 0


方法2(常用)

使用entrySet来获取迭代器对象,进行遍历删除

        Iterator<Map.Entry<Integer, String>> it= testHashMap.entrySet().iterator();//通过entrySet获取迭代器对象
        while (it.hasNext()){                           //使用迭代器进行遍历
            if("AAA".equals(it.next().getValue())){     //值判断
                it.remove();                            //删除
            }
        }
        System.out.println(testHashMap);                  //打印
{2=Two, 3=Three}

Process finished with exit code 0


方法3(常用)(Lambda)

在JDK1.8之后允许使用Lambda表达式实现。
推荐使用removeIf()方法,让代码更加优雅。

        HashMap<Integer, String> testHashMap = new HashMap<>(); //初始化
        testHashMap.put(1, "AAA");
        testHashMap.put(4,"AAA");
        testHashMap.put(2, "Two");
        testHashMap.put(3, "Three");
        testHashMap.entrySet().removeIf(o->o.getValue().equals("AAA")) ;//遍历选择删除
        System.out.println(testHashMap);                  //打印
{2=Two, 3=Three}

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值