Java——List删除相关操作

这篇具有很好参考价值的文章主要介绍了Java——List删除相关操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.List循环删除元素

2.List删除重复元素


1.List循环删除元素

日常业务中,有时候需要我们遍历List列表,并对其中的元素进行判断并进行删除。

(1)List列表中,如果我们要循环删除元素,那么我们是不能直接遍历然后进行remove的:

public class test {
    public static List<String> list = Arrays.asList("check 01","test 01","test 02","check 02","test 03");

    public static void main(String[] args) {
        List<String> nameList = new ArrayList<>(list);
        for (int i=0;i<nameList.size();i++){
            String str = nameList.get(i);
            if (str.startsWith("test")){
                nameList.remove(i);
            }
        }
        System.out.println(nameList);
    }
}

 Java——List删除相关操作

如上,当我们循环遍历删除时,List中remove了一个元素,list的坐标也会发送改变。即当我们匹配了test01这个字符串,并删除后,test02的坐标则向前移动了一步,变成了1而不是2.而随着坐标往后走,test02将永远不会被删除。

针对以上问题,如果我们想要使用普通for循环遍历删除元素,那么我们则需要倒序删除

public class test {
    public static List<String> list = Arrays.asList("check 01","test 01","test 02","check 02","test 03");

    public static void main(String[] args) {
        List<String> nameList = new ArrayList<>(list);
        for (int i=nameList.size()-1;i>0;i--){
            String str = nameList.get(i);
            if (str.startsWith("test")){
                nameList.remove(i);
            }
        }
        System.out.println(nameList);
    }
}

 如上,成功删除List中的所有带test开头的字符按。

(2)那么,如果普通的for循环正常遍历不行,那么使用增强for循环又是否可以呢:

public class test {
    public static List<String> list = Arrays.asList("check 01","test 01","test 02","check 02","test 03");

    public static void main(String[] args) {
        List<String> nameList = new ArrayList<>(list);
        for (String name:nameList){
            if (name.startsWith("test")){
                nameList.remove(name);
            }
        }
        System.out.println(nameList);
    }
}

上述代码会报并发修改错误:

 Java——List删除相关操作

 这是因为list.remove方法中,对元素进行删除主要基于fastremove方法:

Java——List删除相关操作

上述方法中对modCount值进行了修改(该值指对list操作的次数)

而arrayList源码中,初始化时会进行进行把modCount的值赋值到expectedModCount中,进行同步:

Java——List删除相关操作

 在进行增强for循环遍历时,会调用next方法,其中会判断是否存在下一个元素,其中包含以下方法:

Java——List删除相关操作

该方法会对 expectedModCount和modCount进行判断。而remove方法中仅对modCount进行了增加,而没对expectedModCount进行处理,expectedModCount仅仅是ArrayList初始化时的值(即0),所以两值在进行了一次删除后,会不相等,从而抛出异常。

而由于list.forEach()底层也是基于增强for循环实现的,所以也会存在同样的问题。

(3)增强for循环不行,但是我们可以通过迭代器的方式对其进行操作:

public class test {
    public static List<String> list = Arrays.asList("check 01","test 01","test 02","check 02","test 03");

    public static void main(String[] args) {
        List<String> nameList = new ArrayList<>(list);
        for (Iterator<String> iterator = nameList.iterator(); iterator.hasNext();){
            String name = iterator.next();
            if (name.startsWith("test")){
                iterator.remove();
            }
        }
        System.out.println(nameList);
    }
}

 这是因为迭代器的remove方法中对expectedModCount和modCount进行了同步,所以next方法中不会抛出异常:

Java——List删除相关操作

 

2.List删除重复元素

(1)日常业务中,有时候需要我们遍历List列表,删除其中的重复元素,最常用的方法则是双循环判断去重:

public class test {
    public static List<String> list = Arrays.asList("check 01","check 01","test 01","check 01","test 02");

    public static void main(String[] args) {
        List<String> nameList = new ArrayList<>(list);
        for (int i=0; i<nameList.size()-1; i++){
            for (int j=nameList.size()-1; j>i; j--){
                if (nameList.get(j).equals(list.get(i))){
                    nameList.remove(j);
                }
            }
        }
        System.out.println(nameList);
    }
}

(2)而更简单的方法则是利用Set集合的特性(不包含重复元素)对其进行去重:

public class test {
    public static List<String> list = Arrays.asList("check 01","check 01","test 01","check 01","test 01");

    public static void main(String[] args) {
        List<String> nameList = new ArrayList<>(list);
        List<String> resultList = new ArrayList<>(new LinkedHashSet<>(nameList));
        System.out.println(resultList);
    }
}

之所以选用LinkedHashSet而没使用HashSet则是为了保持列表的顺序性。

 (3)又或者,我们可以java8之后的新特性stream进行去重:文章来源地址https://www.toymoban.com/news/detail-496406.html

public class test {
    public static List<String> list = Arrays.asList("check 01","check 01","test 01","check 01","test 01");

    public static void main(String[] args) {
        List<String> nameList = new ArrayList<>(list);
        nameList = nameList.stream().distinct().collect(Collectors.toList());
        System.out.println(nameList);
    }
}

到了这里,关于Java——List删除相关操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 中 List 删除元素

    删除某个元素后,list的大小发生了变化,会导致遍历准确。 这种方式可以用在删除特定的一个元素时使用,但不适合循环删除多个元素时使用 删除元素后继续循环会报错误信息 ConcurrentModificationException ,但是删除完毕马上使用break跳出,则不会触发报错。 iterator遍历过程中

    2024年02月09日
    浏览(43)
  • Java list安全删除元素详解

    前一段时间被问到了关于 List 集合的安全删除元素问题。一时间没反应过来这问题问的是什么,安全体现在什么地方,线程安全?线程安全可以保证元素粒度的数据唯一吗?删除是指什么,list.remove()? 带着这些疑问,重温了一下Java的集合知识。 List为什么需要安全移除? 我

    2024年02月09日
    浏览(44)
  • java 两个list比较,删除相同的元素

    概述 在Java开发中,经常需要比较两个List并删除相同的元素。本文将介绍整个流程,并提供相应的代码示例,帮助新手开发者完成这个任务。 流程 下面是比较两个List并删除相同元素的流程: 代码示例 创建两个List 我们首先需要创建两个List对象,分别代表待比较的两个列表

    2024年02月07日
    浏览(45)
  • Java从List中删除元素的正确用法

    还是先举个例子,你侄女对天文知识感兴趣,然后你就用程序写了太阳系九大星系(水星、金星、地球、火星、木星、土星、天王星、海王星、冥王星)的运行轨迹图,然后拿给侄女看。然后她说错了错了,你的知识太旧了,多了一颗星。根据2006年8月24日国际天文联合大会召

    2024年02月09日
    浏览(41)
  • Java 定义返回一个不能被修改、删除元素的List

      为啥突然分享下这个,也是从mybatis源码看到了,所以想分享下: org.apache.ibatis.plugin.InterceptorChain   使用 Collections.unmodifiableList(); 示例: 运行效果: 不给动。  

    2024年02月13日
    浏览(50)
  • 【笔记】Java中for循环遍历删除操作

    在Java中,有些场景需要遍历集合中的元素,然后根据条件进行删除元素的操作。如果使用传统的for循环遍历方式来删除元素,很可能出错或发生意想不到的问题。推荐使用 迭代器iterator 完成 1. 推荐使用 迭代器方式****删除 阿里规约:【强制】不要在 foreach 循环里进行元素的

    2024年02月11日
    浏览(44)
  • python 一次性删除列表(list)的空白元素(空内容) 或者 一次性删除列表(list)中的指定元素

    看看下述代码: 输出: 当你遇见这种情况,有哪些方法来去除里面的空内容呢(即 \\\'\\\' )? 1.1 删除空内容(方法一) : 输出: 1.2 删除空内容(方法二) : 需要 配合 lambda 表达式 一起使用! 输出: 2.3 删除指定内容 : 输出: 注 :此方法既可以删除空元素,也可以删除指

    2024年02月03日
    浏览(94)
  • JS循环遍历并删除指定元素

    昨天一个朋友让我帮她修改的一段代码: 需求要每条数据轮播1分钟,然后删除,运行的时候会发现foreach循环中,删除一个之后,其他的就无法删除了。 【分析原因】 数据格式例如:[\\\'a\\\',\\\'b\\\',\\\'b\\\',\\\'c\\\'],需求是删除item为‘b’的元素 第一次循环:SysNotices数据:[\\\'a\\\',\\\'b\\\',\\\'b\\\',\\\'c\\\'],in

    2024年02月09日
    浏览(48)
  • Java文件操作(遍历目录中的文件,找到并删除有指定关键字的文件)

    对于通过java对文件继续读取和写入的操作推荐看读取文件和写入文件操作         扫描指定目录中的文件,并找到名称中包含指定字符的所有普通文件(不包括目录),并后续询问用户是否要删除该文件         实际上题目就要求我们对一个指定的目录下的文件进行遍历

    2024年02月13日
    浏览(48)
  • List集合删除指定元素-四种方法

    第一种 for循环 输出结果为 第二种 迭代器 输出结果为 第三种 stream流 这种过滤是留下符合条件的元素 输出结果为 第四种 removeIf 方法以及 方法引用 removeIf 方法是jdk1.8 Collection以及其子类新增的,作用是过滤指定条件的元素 输出结果为 总结 不言而喻,第四种方法最好用。

    2024年02月09日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包