遍历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(),指针向后移动一次,一个一个的遍历。为了避免此类问题的出现,尽量还是用迭代器比较好。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • telnet如何连接_telnet使用方法

    telnet如何连接_telnet使用方法目录准备的东西开启服务连接准备的东西两台主机这里设主机A和主机B用主机A访问主机B开启服务两台电脑都要开telnet服务这时候连接你会发现连不上,提示23端口未打开。看一下,确实没有打开23端口。启动之后23端口就打开了。如下图所示连接连接过程中,会提示这个错误。是因为我们用A访问B时,用的B主机上面的账户。但是B主机的账户并没有在TelnetClicents这个组里。在B主机里把账户添加到这个组就可以连接了。…

  • Matlab画图线型、符号及颜色汇总[通俗易懂]

    Matlab画图线型、符号及颜色汇总[通俗易懂]【1】线型、标记符、颜色的说明【2】对于坐标轴的注释内容xlabel,ylabel的属性说明figure,plot(Seg1,SS1_QJ1,’k’);holdonplot(Seg1,SS1_QJ1,’ks’)plot(Seg1,Q1*ones(length(Seg1)),’r’)xlabel(‘\bf{安装角}(°)’,’FontS…

  • 【零基础】MT4量化入门一:跑一个简单的boll

    【零基础】MT4量化入门一:跑一个简单的boll一、前言  今天开始研究MT4了,MT4是大大有名的外汇交易和量化软件,使用一种叫做MQL的语言来开发量化程序(跟C比较像)。因为是外国人做的,用的也大部分是外国人,使用起来不是很顺手,跟极星各有优劣吧。这里我就先逐步讲一下MT4的使用,然后再简单跑一个boll指标,最后汇总下使用心得。二、安装  1、下载MT4  不熟悉这东西,连安装都是个麻烦事儿。MT4官网好找一搜就有,下载链…

  • android采用videoView播放视频(包装)

    android采用videoView播放视频(包装)

  • python之意外发现turtle的强大

    python之意外发现turtle的强大闲来无事,上网闲逛,无意中发现了turtle这个库,于是各种百度去了解,才知道这库niubi啊,居然可以画画!!!!1、turtle安装python3的话直接输入pipinstallturtle哈哈,是不是报错:Command“pythonsetup.pyegg_info”failedwitherrorcode1这是因为setup.py中有个语法在python3不…

  • 基数排序中的LSD方法和MSD方法

    基数排序中的LSD方法和MSD方法最高位优先(MostSignificantDigitfirst)法,简称MSD法:先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。最低位优先(LeastSignificantDigitfirst)法,简称LSD法:先从kd开始排序,再对

发表回复

您的电子邮箱地址不会被公开。

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