遍历一个list,并删除集合中元素的几种方式

一、普通for循环结合remove删除

这种方式存在缺点,就是会漏删。

当使用普通的for循环(即for (int i = 0; i < list.size(); i++))遍历List时,每次循环都会根据当前的索引i来访问列表中的特定元素。然而,在遍历过程中如果直接删除元素,会导致列表的大小发生变化,进而影响后续元素的索引。

一般会执行i--的操作,以达到避免漏删的情况。

java 复制代码
public void listRemove()
    {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        for (int i = 0; i < list.size(); i++) {
            if (list.get(i) % 2 == 0) {
                list.remove(i);
                i--;
            }
        }

        System.out.println("剩余元素:" + list);
    }

二、普通for循环倒叙删除

倒叙删除主要是结合数组的特点,从尾部删除不会导致下标索引发生改变。

java 复制代码
public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        for (int i = list.size() - 1; i >= 0; i--) {
            if (list.get(i) % 2 == 0) {
                list.remove(i);
            }
        }

        System.out.println("剩余元素:" + list);
    }

三、迭代器循环

java 复制代码
 public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
            Integer element = iterator.next();
            if (element % 2 == 0) {
                iterator.remove();
            }
        }

        System.out.println("剩余元素:" + list);
    }

四、使用Stream流

java 复制代码
public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        // 使用 Stream 过滤出奇数元素,重新生成一个新的列表
        List<Integer> filteredList = list.stream()
               .filter(element -> element % 2!= 0)
               .collect(Collectors.toList());

        System.out.println("剩余元素:" + filteredList);
    }

五、使用removeIf

java 复制代码
public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        // 使用 removeIf 删除偶数元素
        list.removeIf(element -> element % 2 == 0);

        System.out.println("剩余元素:" + list);
    }
相关推荐
FuckPatience1 小时前
C# 修改基类List中某一元素的子类类型
c#·list
梁辰兴5 小时前
数据结构:排序
数据结构·算法·排序算法·c·插入排序·排序·交换排序
野犬寒鸦5 小时前
力扣hot100:搜索二维矩阵 II(常见误区与高效解法详解)(240)
java·数据结构·算法·leetcode·面试
菜鸟得菜5 小时前
leecode kadane算法 解决数组中子数组的最大和,以及环形数组连续子数组的最大和问题
数据结构·算法·leetcode
楼田莉子6 小时前
C++算法专题学习——分治
数据结构·c++·学习·算法·leetcode·排序算法
ulias2127 小时前
各种背包问题简述
数据结构·c++·算法·动态规划
JuneXcy8 小时前
结构体简介
c语言·数据结构·算法
j_xxx404_10 小时前
数据结构:栈和队列力扣算法题
c语言·数据结构·算法·leetcode·链表
南莺莺10 小时前
假设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法来判别,表达式中的括号是否配对,以字符“\0“作为算术表达式的结束符
c语言·数据结构·算法·
野犬寒鸦10 小时前
力扣hot100:旋转图像(48)(详细图解以及核心思路剖析)
java·数据结构·后端·算法·leetcode