返回顶部
首页 > 资讯 > 后端开发 > Python >java 如何在list中删除我指定的对象
  • 892
分享到

java 如何在list中删除我指定的对象

2024-04-02 19:04:59 892人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录遍历list,删除指定对象的三种方式1、再定义一个List,用来保存需要删除的对象2、不用for-each循环,使用倒序循环删除3、用迭代器删除Iterator的工作机制List

遍历list,删除指定对象的三种方式

1、再定义一个List,用来保存需要删除的对象

修改部分代码:


 List<User> userRemove = new ArrayList<User>();
        //找出要删除的用户
        System.err.println("要删除的用户:");
        for (User result : list)
        {
            if (result.getId() == 1 || result.getId() == 3)
            {
                userRemove.add(result);
                System.err.println("id:" + result.getId() + "\tname:" + result.getName());
            }
        }
        list.removeAll(userRemove);
        //剩下的用户
        System.err.println("剩下的用户:");
        for (User result : list)
        {
            System.err.println("id:" + result.getId() + "\tname:" + result.getName());
        }

2、不用for-each循环,使用倒序循环删除


for(int i=list.size()-1;i>=0;i--)
                {
                    User result = list.get(i);
                    if (result.getId() == 3)
                    {
                        list.remove(result);
                        System.err.println("id: " + result.getId() + "\tname: " + result.getName());
                    }
                }

3、用迭代器删除


Iterator<User> it = list.iterator();
        while (it.hasNext())
        {
            User userObj = it.next();
            if (userObj.getId() == 3)
            {
                it.remove();
            }
        }
        //剩下的用户
        System.err.println("剩下的用户:");
        for (User result : list)
        {
            System.err.println("id:" + result.getId() + "\tname:" + result.getName());
        }

PS: 用for-each遍历 实际上使用的是Iterator迭代器

Iterator的工作机制

Iterator是工作在一个独立的线程中,并且拥有一个 mutex,就是说Iterator在工作的时候,是不允许被迭代的对象被改变的。

Iterator被创建的时候,建立了一个内存索引表(单链表),这 个索引表指向原来的对象,当原来的对象数量改变的时候,这个索引表的内容没有同步改变,所以当索引指针往下移动的时候,便找不到要迭代的对象,于是产生错 误。

List、Set等是动态的,可变对象数量的数据结构,但是Iterator则是单向不可变,只能顺序读取,不能逆序操作的数据结构,当 Iterator指向的原始数据发生变化时,Iterator自己就迷失了方向。

三种方式 方便以后学习

List集合删除元素的正确姿势

在阅读阿里巴巴规约的时候发现有一条规约是关于List的【不要在foreach里面进行元素的remove/add操作,remove请使用Iterator方式】。然后想起以前自己做项目的时候删除某一元素的逻辑报下标越界错误,那时候记得处理是用一新的List进行存储,然后整体从原List移除所有符合规则的元素,现在做一总结。用这个Iterator主要可以避免下标越界或者遍历是漏掉符合规则的下一个数据。

先拉出来正确删除元素的姿势。正确姿势是利用Iterator的remove方法。具体操作如下:


public static void main(String[] args) {
        List<Integer> lists = new ArrayList<Integer>();
        lists.add(1);
        lists.add(2);
        lists.add(3);
        lists.add(4);
        lists.add(5);
        Iterator<Integer> iterator = lists.iterator();
        while (iterator.hasNext()){
            Integer obj = iterator.next();
            if(3==obj || 4==obj){
                iterator.remove();
            }
        }
        System.out.println(lists);
    }

附上自己比较笨的操作方式:


public static void main(String[] args){
            List<Integer> lists = new ArrayList<Integer>();
            List<Integer> listscopy = new ArrayList<>();
            lists.add(1);
            lists.add(2);
            lists.add(3);
            lists.add(4);
            lists.add(5);
            int size = lists.size();
            for (int i = 0; i < lists.size(); i++) {
                if(3==lists.get(i) || 4 == lists.get(i)){
                    listscopy.add(lists.get(i));
                }
            }
            lists.removeAll(listscopy);
            System.out.println(lists);
        }

常用的错误方式有以下三种

第一种方式,多出现下标越界问题。这个主要原因是因为我们在循环遍历时,将我们的长度进行定值确定。而忽略掉在满足条件时,list的长度是减少的。


public static void main(String[] args) {
 List<Integer> lists = new ArrayList<Integer>();
        lists.add(1);
        lists.add(2);
        lists.add(3);
        lists.add(4);
        lists.add(5);
        int size = lists.size();  // 定长设置,会造成元素下标越界,如果将for中变量直接换成lists.size()可以吗?
        for (int i = 0; i < size; i++) {
            if(3==lists.get(i) || 4 == lists.get(i)){
                lists.remove(i); //lists.remove(lists.get(i));
            }
        }
        System.out.println(lists);
 }

第二种方式也就是上面的注释所说,既然会出现下标越界,那我就利用动态的大小不就可以了,但是利用这种方法会产生另外一种情况,就是会忽略掉remove元素后面的一个元素,这个是因为删除符合规则的元素后,list长度减一,而同时后面的元素往前补一位,造成当前i值下对应两个元素。


public static void main(String[] args) {
        List<Integer> lists = new ArrayList<Integer>();
        lists.add(1);
        lists.add(2);
        lists.add(3);
        lists.add(4);
        lists.add(5);
        int size = lists.size();
        for (int i = 0; i < lists.size(); i++) {
            if(3==lists.get(i) || 4 == lists.get(i)){
                lists.remove(i); //lists.remove(lists.get(i));
            }
        }
        System.out.println(lists); // 打印[1, 2, 4, 5] 此时会将4忽略掉
    }

第三种方式是利用增强FOR循环造成的。这种方式会直接给报错:


ERRORInfo:
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
public static void main(String[] args) {
        List<Integer> lists = new ArrayList<Integer>();
        lists.add(1);
        lists.add(2);
        lists.add(3);
        lists.add(4);
        lists.add(5);
       for (Integer i : lists){
           if(3==i || 4==i){
               lists.remove(i);
           }
       }
        System.out.println(lists);
    }

这种情况下。主要是集合遍历是使用Iterator, Iterator是工作在一个独立的线程中,并且拥有一个互斥锁。Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast原则 Iterator 会马上抛出java.util.ConcurrentModificationException 异常。所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: java 如何在list中删除我指定的对象

本文链接: https://lsjlt.com/news/157502.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java 如何在list中删除我指定的对象
    目录遍历list,删除指定对象的三种方式1、再定义一个List,用来保存需要删除的对象2、不用for-each循环,使用倒序循环删除3、用迭代器删除Iterator的工作机制List...
    99+
    2024-04-02
  • R语言 如何删除指定变量或对象
    R语言中删除指定变量或对象,可以直接删除某名字的变量或对象,也可以删除以字符串形式表示的变量和对象。 例如: 1、直接删除 >a<-c(1,2,3) >rm(...
    99+
    2024-04-02
  • 怎么在R语言中删除指定变量或对象
    这篇文章给大家介绍怎么在R语言中删除指定变量或对象,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、直接删除>a<-c(1,2,3)>rm(a)2、以字符串形式的方式删除>a<-c(1,2...
    99+
    2023-06-14
  • java如何删除对象属性
    在Java中,要删除对象的属性,可以使用以下方法:1. 将属性设置为null:可以将属性的引用设置为null,表示对象不再引用该属性...
    99+
    2023-10-18
    java
  • 【java】List对象集合去除特定对象的优雅写法(基于java8)
    【java】List对象集合去除特定对象的优雅写法(基于java8) 主要用的是 Java List.removeIf方法,该方法用于删除所有满足特定条件的数组元素,入参其实是一个布尔值的表达式即可。 使用场景,用户类中的性别字段有三个,分...
    99+
    2023-08-17
    java servlet 开发语言
  • php如何删除指定k键的键值对
    今天小编给大家分享一下php如何删除指定k键的键值对的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。unset函数PHP中可以...
    99+
    2023-07-05
  • javascript如何删除对象的属性
    这篇文章主要介绍了javascript如何删除对象的属性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在javascript中,可以使用delete运算符来删除对象的属性,它...
    99+
    2023-06-15
  • java判断map中是否存在指定对象
    Map判断是否包含指定的value使用containsValue方法。(推荐:java视频教程)定义containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true示例: public c...
    99+
    2019-07-25
    java map
  • 如何删除Linked List中的节点
    今天就跟大家聊聊有关如何删除Linked List中的节点,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Delete Node in a Linked List题目请编写一个函数,使...
    99+
    2023-06-19
  • java中如何判断map集合对象中是否存在指定key
    该方法判断Map集合对象中是否包含指定的键名。如果Map集合中包含指定的键名,则返回true,否则返回false。语法:containsKey(Object key)判断方法:首先定义一个map对象,然后通过“put()”方法向集合中添加对...
    99+
    2014-07-07
    java基础 java 判断 map集合对象 指定 key
  • Redis中redis-cluster如何删除指定的key
    这篇文章主要为大家展示了“Redis中redis-cluster如何删除指定的key”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Redis中redis-clu...
    99+
    2024-04-02
  • PHP如何删除数组中的指定值
    本篇内容主要讲解“PHP如何删除数组中的指定值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP如何删除数组中的指定值”吧!什么是PHP数组?在PHP中,数组是一种可以存储多个值的数据类型。数...
    99+
    2023-07-05
  • Java8如何移除两个相同的List对象
    目录Java8 移除两个相同List对象如果多个条件筛选出List不被另一个List包含的元素Java8 移除两个相同List对象 List<Data>...
    99+
    2024-04-02
  • java如何删除所有出现的指定字符
    这篇文章主要介绍了java如何删除所有出现的指定字符,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如何删除所有出现的指定字符字符串类没有提供 remove() 方法,但提供了...
    99+
    2023-06-27
  • php如何删除数组中的指定的值
    今天小编给大家分享一下php如何删除数组中的指定的值的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在PHP中,数组是一种重要...
    99+
    2023-07-05
  • 如何从JavaScript数组中删除空对象
    目录从数组中删除空对象:补充:特殊位置删除总结从数组中删除空对象: 使用 Array.filter() 方法遍历数组。将每个对象传递给 Object.k...
    99+
    2023-05-19
    js删除数组中的空对象 js数组删除空元素 js数组删除空对象
  • 如何从 golang fyne 容器中删除对象
    知识点掌握了,还需要不断练习才能熟练运用。下面编程网给大家带来一个Golang开发实战,手把手教大家学习《如何从 golang fyne 容器中删除对象》,在实现功能的过程中也带大家重新温习相关知识...
    99+
    2024-04-04
  • JavaScript如何为创建的对象指定prototype对象
    这篇文章主要为大家展示了“JavaScript如何为创建的对象指定prototype对象”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript如何为...
    99+
    2024-04-02
  • Java 如何从list中删除符合条件的数据
    目录从list中删除符合条件的数据删除list中某个特定元素从list中删除符合条件的数据 在Java语言使用中经常会遇到需要从list中去除一些数据,但是初学者经常会遇到如下的坑:...
    99+
    2024-04-02
  • 如何在GridView中删除选定的行
    要在GridView中删除选定的行,可以按照以下步骤进行操作:1. 在GridView中设置选择模式为单选或多选模式。可以通过设置`...
    99+
    2023-09-26
    GridView
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作