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


相关推荐

  • MySQL——MySQL 图形化管理工具的介绍

    MySQL——MySQL 图形化管理工具的介绍文章目录MySQL——MySQL图形化管理工具的介绍1、MySQLWorkbench2、Navicat3、SQLyog4、DBeaver5、DataGripMySQL——MySQL图形化管理工具的介绍MySQL图形化管理工具极大地方便了数据库的操作与管理,常用的图形化管理工具有:MysQLWorkbench、phpMyAdmin、NavicatPreminum、MySQLDumper、SQLyog、dbeaver、MysQLODBcConnector、DataGrip。1、MySQL

    2022年6月30日
    23
  • 摄像头为什么要公网ip_安装监控为什么需要公网ip

    摄像头为什么要公网ip_安装监控为什么需要公网ip原标题:三种方法告诉你项目超过255个摄像机怎么设置IP?我们做弱电的,与ip地址接触最多,无论是弱电的哪方面,都需要跟ip地址打交道,通常我们也会经常听到公网、内网?那什么是公网ip地址呢?什么是私网ip地址呢?为什么我们常见到的ip地址以开头呢?还有就是一个网段只能容纳254个摄像机,但是我现在项目比较大,都有300多个摄像机了,该咋分配IP地址呢?我们今天统统来了解一下。首先关于内、外…

    2022年9月25日
    0
  • linux查看分区类型(查看文件系统类型 centos)

    1,fdisk-l fdisk-l只能列出硬盘的分区表、容量大小以及分区类型,但看不到文件系统类型。2,df-hdf命令是用来查看文件系统磁盘空间使用量的。但df命令只会列出已挂载的文件系统信息,对于没有挂载的文件系统是查看不到的。使用这个命令可以很方便的查看已挂载的文件系统的空间使用量、剩余空间大小等信息。3,parted

    2022年4月13日
    380
  • eclipse汉化版使用教程(安卓市场(官方版本))

    Eclipse汉化教程1.确定Eclipse的版本方法一:打开eclipse,在启动画面中可以看到eclipse的版本名称(我的版是Photon),记住这个版本的名称;方法二:在Eclipse启动后,点击菜单栏中的**Help(帮助)&amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;gt;AboutEclipse(关于EclipseIDE)**会弹出的AboutEclipse窗口,在这里也可以找到当前Ec

    2022年4月16日
    187
  • linux .vimrc设置 tab设置

    linux .vimrc设置 tab设置一.仅设置当前用户的Tab键宽度输入命令:vim~/.vimrc然后:settabstop=4 //我这里将Tab键的宽度设置为4保存:ctrl+z+z(或:wq!)OK!二.设置所有用户的Tab键宽度输入命令:vim/etc/vimrc在vimrc文件的最后添加:settabstop=4保存:ctrl+z+z(或:wq!)OK!这样不管是哪个用…

    2022年5月3日
    60
  • post调试工具_HTTP设置

    post调试工具_HTTP设置此工具用于http调试;具有以下特点;1.支持HTTP和HTTPS(SSL加密)网络协议的跟踪和调试。2.可以查看到HTTP/HTTPS协议连接的详细过程和返回结果。3.允许GET/POST/HEAD/PUT四种连接方式。4.支持HTTP的Proxy代理。5.自动处理重定向Redirect功能。6.自动处理Cookie的接收和发送。7.可以自行设置和增加HTTP请求命令的参数。先试一下本地使用;本地IIS9001端口发布了一个网站;按下图输入;点击St…

    2022年10月9日
    0

发表回复

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

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