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


相关推荐

  • linux tar 绝对路径,tar打包使用绝对路径详解

    linux tar 绝对路径,tar打包使用绝对路径详解首先应该明确:*nix系统中,使用tar对文件打包时,一般不建议使用绝对路径。通常是在两台环境相似的机器上进行同步复制的时候,才有需要使用绝对路径进行打包。使用绝对路径打包时如果不指定相应的参数,tar会产生一句警告信息:”tar:Removingleading`/’frommembernames”,并且实际产生的压缩包会将绝对路径转化为相对路径。比如:root@queen~#t…

    2022年5月24日
    63
  • Java IO流学习总结一:输入输出流[通俗易懂]

    Java IO流学习总结一:输入输出流[通俗易懂]JavaIO流学习总结一:输入输出流转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/53761199本文出自【赵彦军的博客】Java流类图结构:流的概念和作用流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直

    2022年4月27日
    42
  • Android ListView等列表设置空布局

    Android ListView等列表设置空布局在Android平台上,listView是特别常用的组件之一,我们在向用户展示列表数据时,通常要考虑:列表有数据和无数据空的状态,因为网络环境各异,难免刷新失败什么的;在此之前我是使用ViewStub来实现,通过判断listview列表数据是否为空来设置ViewStub的隐藏和显示,或者设置lIstview的显示或隐藏;但是,对ViewStub不是特别的了解,把控不好,只是控

    2022年7月22日
    13
  • 详解Cisco ACS AAA认证

    详解Cisco ACS AAA认证详解CiscoACSAAA认证近来,有些同学会问到关于AAA认证的问题,以及ciscoACS如何使用,那么今天我们就主要来讲一下关于这方面的知识。AAA代表Authentication、Authorization、Accounting,意为认证、授权、记帐,其主要目的是管理哪些用户可以访问服务器,具有访问权的用户可以得到哪些服务,如何…

    2022年5月10日
    43
  • case label does not reduce to_class not loaded

    case label does not reduce to_class not loadedClassCastException出现原因解决办法出现原因抛出以指示代码已尝试将对象强制转换为它不是实例的子类。例如,以下代码生成一个ClassCastException:对象x=新整数(0);System.out.println((String)x);解决办法这种异常我也不知道有什么能够完全解决的办法,但是可以同instanseof来避免例如:Pet宠物类   Dog狗狗类(继承Pet)  Penguin企鹅类(继承Pet)  Dogdog=(Dog)pet

    2025年10月9日
    3
  • Layui 弹出层插件

    Layui 弹出层插件Layui弹出层插件开发工具与关键技术:VisualStudio2015–Layui作者:廖亚星撰写时间:2019年6月4日这段时间在做项目页面的搭建,在页面的操作中,会出现很多的弹出层,这能使用户在一个页面中执行更多的操作,而我的项目里面用的弹出层是Layui里面的弹出层插件。Layui的弹出层插件可以作为独立组件使用,也可以Layui模块化使用基本参数:type—…

    2022年6月13日
    69

发表回复

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

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