Java 如何从list中删除符合条件的数据

 更新时间:2021年11月17日 10:06:27   作者:年少的风  
这篇文章主要介绍了Java 如何从list中删除符合条件的数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

从list中删除符合条件的数据

在Java语言使用中经常会遇到需要从list中去除一些数据,但是初学者经常会遇到如下的坑:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 5, Size: 4
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at Main.remove3(Main.java:44)
at Main.main(Main.java:18)

所以在此总结一下从list中删除数据的一些方法:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        ArrayList<String> strs = new ArrayList<>();
        strs.add("1");
        strs.add("32");
        strs.add("3");
        strs.add("4");
        strs.add("5");
        strs.add("36");
//        remove1(strs);
//        remove2(strs);
//        remove3(strs);
        remove4(strs);
        System.out.println("after");
        printList(strs);
    }
    //使用iterator,这个是java和Android源码中经常使用到的一种方法,所以最为推荐
    public static void remove1(List<String> list) {
        Iterator<String> sListIterator = list.iterator();
        while (sListIterator.hasNext()) {
            String str = sListIterator.next();
            if (str.contains("3")) {
                sListIterator.remove();
            }
        }
    }
    //倒序删除,以防因为删除中间项导致数据下标变更,使得数据出错
    public static void remove2(List<String> list) {
        for (int i = list.size() - 1; i >= 0; i--) {
            if (list.get(i).contains("3")) {
                list.remove(i);
            }
        }
    }
    // 顺序删除,但是对下标和索引进行了处理
    public static void remove3(List<String> list) {
        for (int i = 0, len = list.size(); i < len; i++) {
            if (list.get(i).contains("3")) {
                list.remove(i);
                len--;
                i--;
            }
        }
    }
    // 在遍历过程中不直接操作原list
    public static void remove4(List<String> list) {
        List<String> temp = new ArrayList<>();
        for (String str : list) {
            if (str.contains("3")) {
                temp.add(str);
            }
        }
        list.removeAll(temp);
    }
    public static void printList(List<String> list) {
        for (String str : list) {
            System.out.println(str);
        }
    }
}

如果还有其他好的方法再补充。

删除list中某个特定元素

当数据库查询出数据过后,发现有些数据不需要,所以这里要处理一下,加入循环list,根据判断条件去删除的话,就会出现异常。

所以这里用到了java8的新特性去删除。

  List<UserFictitious> list = new ArrayList<>();
        for (int i = 0; i < 50; i++){
            UserFictitious userFictitious = new UserFictitious();
            userFictitious.setUserFictitiousName(String.valueOf(i));
            list.add(userFictitious);
        }
  list.removeIf(item -> item.getUserFictitiousName().equals("1"));
  System.out.println(list);

底层的源码是根据迭代器的特性去删除,java8只是封装进了removeIf,简化了代码。

  default boolean removeIf(Predicate<? super E> filter) {
        Objects.requireNonNull(filter);
        boolean removed = false;
        final Iterator<E> each = iterator();
        while (each.hasNext()) {
            if (filter.test(each.next())) {
                each.remove();
                removed = true;
            }
        }
        return removed;
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Springboot+Stomp协议实现聊天功能

    Springboot+Stomp协议实现聊天功能

    本示例实现一个功能,前端通过websocket发送消息给后端服务,后端服务接收到该消息时,原样将消息返回给前端,前端技术栈html+stomp.js,后端SpringBoot,需要的朋友可以参考下
    2024-02-02
  • MyBatisPlus批量添加的优化与报错解决

    MyBatisPlus批量添加的优化与报错解决

    MybatisPlus是一个高效的java持久层框架,它在Mybatis的基础上增加了一些便捷的功能,提供了更加易用的API,可以大幅度提高开发效率,这篇文章主要给大家介绍了关于MyBatisPlus批量添加的优化与报错解决的相关资料,需要的朋友可以参考下
    2023-05-05
  • Java实现五子棋游戏

    Java实现五子棋游戏

    这篇文章主要为大家详细介绍了Java实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • 深入了解Java Synchronized锁升级过程

    深入了解Java Synchronized锁升级过程

    java中的锁是针对对象而言的,它锁住的是一个对象,并且具有可重入的性质,下面这篇文章主要给大家介绍了关于Java Synchronized锁升级过程的相关资料,需要的朋友可以参考下
    2022-03-03
  • Java对象以Hash结构存入Redis详解

    Java对象以Hash结构存入Redis详解

    这篇文章主要介绍了Java对象以Hash结构存入Redis详解,和Java中的对象非常相似,却不能按照Java对象的结构直接存储进Redis的hash中,因为Java对象中的field是可以嵌套的,而Redis的Hash结构不支持嵌套结构,需要的朋友可以参考下
    2023-08-08
  • Java实现简单图书借阅系统

    Java实现简单图书借阅系统

    这篇文章主要为大家详细介绍了Java实现简单图书借阅系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 使用Sentinel实现流控和服务降级的代码示例

    使用Sentinel实现流控和服务降级的代码示例

    Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,本文将详细为大家介绍如何使用Sentinel实现流控和服务降级,文中有相关的代码示例,需要的朋友可以参考下
    2023-05-05
  • 详解Java编程中if...else语句的嵌套写法

    详解Java编程中if...else语句的嵌套写法

    这篇文章主要介绍了Java编程中if...else语句的嵌套写法,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • Spring Boot 整合 Druid过程解析

    Spring Boot 整合 Druid过程解析

    这篇文章主要介绍了Spring Boot 整合 Druid过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 设计模式之构建(Builder)模式 建造房子实例分析

    设计模式之构建(Builder)模式 建造房子实例分析

    构建模式主要用来针对复杂产品生产,分离部件构建细节,以达到良好的伸缩性,考虑到设计模式来源于建筑学,因此举一个建造房子的例子,需要的朋友可以参考下
    2012-12-12

最新评论