遍历ArrayList,并删除某些元素的方法实现「建议收藏」

遍历ArrayList,并删除某些元素的方法实现「建议收藏」本文是根据https://blog.csdn.net/qq_32575047/article/details/78902254的帖子进行整理的,在此感谢一下。题目:一个ArrayList对象aList中存有若干个字符串元素,现欲遍历该ArrayList对象,删除其中所有值为”abc”的字符串元素,请用代码实现。publicclassTest1{public…


Jetbrains全系列IDE稳定放心使用

本文是根据 https://blog.csdn.net/qq_32575047/article/details/78902254 的帖子进行整理的,在此感谢一下。

题目:一个ArrayList对象aList中存有若干个字符串元素,现欲遍历该ArrayList对象,删除其中所有值为”abc”的字符串元素,请用代码实现。

public class Test1 {  
  
    public static void main(String[] args) {  
        ArrayList<String> aList = new ArrayList<String>();  
        aList.add("a");  
        aList.add("ab");  
        aList.add("abc");  
        aList.add("abcr");  
        aList.add("abc");  
        aList.add("abcf");  
        aList.add("abc");  
        aList.add("abdc");  
          
        for(int i = 0;i < aList.size();i++){  
            if(aList.get(i).equals("abc")){  
                aList.remove(i);  
            }  
        }  
          
        System.out.println(aList);  
    }  
}  

输出结果为:[a, ab, abcr, abcf, abdc]

也可以使用迭代器来遍历:

Iterator<String> iter = aList.iterator();  
        while(iter.hasNext()){  
            if(iter.next().equals("abc")){  
                iter.remove();  
                  
            }  

结果与上面相同。

现在修改一下aList , 添加一条数据“abc”  , 再次执行上面的两段代码,看一下有什么区别。

ArrayList<String> aList = new ArrayList<String>();  
        aList.add("a");  
        aList.add("ab");  
        aList.add("abc");  
        aList.add("abc");  //多加的一行  
        aList.add("abcr");  
        aList.add("abc");  
        aList.add("abcf");  
        aList.add("abc");  
        aList.add("abdc");  

然后再用for循环遍历,结果变为:

[a, ab, abc, abcr, abcf, abdc]   发现有一个“abc”没有被移除掉。

然而使用迭代器,答案是对的,所有的“abc”都被移除掉了。

出现这种情况的原因是什么呢?

因为ArrayList底层的数据结构是数组, 对于数组的特性,我们都知道, 如果删除其中某个元素的话,那么该元素后面的所有元素都会前移一个位置,结合这个特性,回到刚才的for循环中,就能很好的解释为什么漏删一条“abc” 了:

for(int i = 0;i < aList.size();i++){  
            if(aList.get(i).equals("abc")){  
                aList.remove(i);  //删除第一个“abc”时,后面的元素依次迁移一个位置,也就是说第二个“abc”填充到了第一个“abc”的原位置上。但是第一个“abc” remove后,执行了i++,是“原位置”的下一个位置,处于“原位置”的第二个“abc”逃过一劫,所以在结果中会出现一条“abc”
            }  

可以进行如下改进:

for(int i = 0;i < aList.size();i++){  
   if(aList.get(i).equals("abc")){  
      aList.remove(i);  
      i--;  
   }  
}  

或者进行如下改进(ArrayList从后往前遍历):

for(int i = aList.size() -1 ;i >= 0 ; i--){  
    if(aList.get(i).equals("abc")){  
       aList.remove(i);  
    }  
}  

而迭代器不会有这样的问题是因为hasNext()方法,原理是指针向后移动,每运行一次it.next(),指针向后移动一次,一个一个的遍历。为了避免此类问题的出现,尽量还是用迭代器比较好。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187326.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • webstorm 2021 激活码[在线序列号]

    webstorm 2021 激活码[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
  • 学习笔记:远程连接服务之SSH

    学习笔记:远程连接服务之SSH

    2021年6月5日
  • 理解self,this,parent

    理解self,this,parent

    2021年6月30日
  • CentOS 7安装图形化界面

    CentOS 7安装图形化界面在安装CentSO7时,如果选择“最小化安装“,那么系统只有命令行界面,没有图形化界面。有些小伙伴喜欢使用图形化界面,本文笔者带小伙伴们一起安装图形化界面。1、开启CentOS7以root用户登录(普通用户权限不够),如下图所示:2、配置网络网卡,确保与外网连通(后续要下载相应的包):在命令行界面输入命令cd/etc/sysconfig/network-scripts/进入network-scripts目录,再输入ls命令查看目录下的文件,我们可以看到ifcfg-ens32(有可能有区别)

    2022年5月20日
  • 用js来实现那些数据结构03(数组篇03-排序及多维数组)

    终于,这是有关于数组的最后一篇,下一篇会真真切切给大家带来数据结构在js中的实现方式。那么这篇文章还是得啰嗦一下数组的相关知识,因为数组真的太重要了!不要怀疑数组在JS中的重要性与实用性。这篇文章分为

    2022年3月25日
  • Java线上问题排查神器Arthas快速上手与原理浅谈

    Java线上问题排查神器Arthas快速上手与原理浅谈前言当你兴冲冲地开始运行自己的Java项目时,你是否遇到过如下问题:程序在稳定运行了,可是实现的功能点了没反应。为了修复Bug而上线的新版本,上线后发现Bug依然在,却想不通哪里有问题?想到可能出现问题的地方,却发现那里没打日志,没法在运行中看到问题,只能加了日志输出重新打包——部署——上线程序功能正常了,可是为啥响应时间这么慢,在哪里出现了问题?程序不但稳定运行,而且功能完美,但…

    2022年11月1日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号