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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • IDEA自动导包配置总结

    IDEA自动导包配置总结IDEA 实用功能之自动导包设置自动导包是什么意思 原本我们在 eclipse 中 如果要引用一个方法 发现缺少这个方法所需要的包 需要手工去输入 比如我们要用到 FileInputStr 流 需要在前面输入 importjava io 而在 IDEA 中 通过简单的设置不但会帮你解决自动导入你想要的包 即你只要自己用方法就行 所依赖的包 IDEA 会帮你搞定 除此之外 IDEA 还会帮你优化引入包的结构 即删除一些没有的 import 的语句 下面是 AutoImport 设置步骤详解 Setting

    2025年7月17日
    3
  • linux安装pycharm详细步骤[通俗易懂]

    linux安装pycharm详细步骤[通俗易懂]一、用xftp远程根据把解压后的安装包文件上传到指定目录/opt/module/。然后,cd/opt/pycharm-community-linux-2018.1.4/bin/,执行以下代码赋予pycharm.sh执行权限[atguigu@hadoop101bin]$chmodu+xpycharm.sh最后,执行$shpycharm.sh启动pycharm[atguigu@hadoop101bin]$pycharm.shStartupError:Unab…

    2022年8月25日
    8
  • 网页跳转qq聊天代码_html全屏代码

    网页跳转qq聊天代码_html全屏代码偶尔从某地得到我去看了看,果然可以但是又想了想他是怎么样和TENCENT数据库连接的呢?呵呵~自己做一个吧!原代码如下,自己有PHP空间的话,你也可以提供QQ在线的js代码服务了!连接代码把下面的代码保存成PHP文件就可以了!我想他也是连接别人的数据吧~那我也连接一下他的http://www.gaodaima.com/45503.html让你拥有自己的QQ在线显示代码(又是转_php$file=f…

    2022年10月17日
    2
  • JS中promise是什么?

    JS中promise是什么?Promise是异步编程的一中解决方案,最早是由社区提出的,es6中正式的将其纳入,他是一个对象,可以获取到异步的操作,他相比传统的回调函数,更加的强大和合理,避免了回调地狱。所谓的Promise,简单的来说就是一个可以存放未来才能结束的任务或者事件。1.Promise实列有三个状态:-pending(进行中)-resolved(成功)-rejected(失败)当要处理某个任务的时候,promise的状态是pending,任务完成是状态就变成了resolved,任务失败状

    2022年4月30日
    94
  • Java线程池参数配置

    Java线程池参数配置在线程池的实际使用中,参数的配置总让人难以把握。在网上搜了一下,主要有以下的方案。跟大家分享。1.基本概念1.1ThreadPoolExecutor的重要参数corePoolSize:核心线程数核心线程会一直存活,及时没有任务需要执行 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理 设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭queueCapacity:任务队列容量(阻塞队列)当核心线程数达到最大时,

    2022年5月23日
    68
  • Java中八大基本数据类型详解[通俗易懂]

    Java中八大基本数据类型详解[通俗易懂]自从Java发布以来,基本数据类型就是Java语言的一部分,分别是byte,short,int,long,char,float,double,boolean.当然围绕着这些基本数据类型衍生出来了很多面试题,但是说实话,工作中基本用不到

    2022年7月7日
    39

发表回复

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

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