zoukankan      html  css  js  c++  java
  • ArrayList在for循环中使用remove方法移除元素方法介绍

    https://www.jb51.net/article/124990.htm

    这篇文章主要介绍了ArrayList在for循环中使用remove方法移除元素的内容,介绍了具体代码实现,需要的朋友可以参考下。

    有时候我们需要在一个ArrayList的for循环中动态删除元素的需求, 废话不多说看代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    List<Integer> list = new ArrayList<Integer>();
    list.add(0);
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    list.add(5);
    list.add(6);
    list.add(7);
    //正常循环
    for (int i = 0; i < list.size(); i++) {
     System.out.println("i的值:" + i + " 对应的数字:" + list.get(i));
    }
    System.out.println("没有remove前list的项:"+list.size());
    //边循环边删除
    for (int i = 0; i < list.size(); i++) {
     System.out.println("i的值:" + i + " 对应的数字:" + list.get(i));
     if(list.get(i) == 3) list.remove(list.get(i));//删除list的第四项
    }
    System.out.println("remove后list的项:"+list.size());
    System.out.println("==========remove后的list==========");
    for (int i = 0; i < list.size(); i++) {
     System.out.println("i的值:" + i + " 对应的数字:" + list.get(i));
    }

    执行代码, 结果如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    i的值:0 对应的数字:0
    i的值:1 对应的数字:1
    i的值:2 对应的数字:2
    i的值:3 对应的数字:3
    i的值:4 对应的数字:4
    i的值:5 对应的数字:5
    i的值:6 对应的数字:6
    i的值:7 对应的数字:7
    没有remove前list的项:8
    i的值:0 对应的数字:0
    i的值:1 对应的数字:1
    i的值:2 对应的数字:2
    i的值:3 对应的数字:3
    i的值:4 对应的数字:5
    i的值:5 对应的数字:6
    i的值:6 对应的数字:7
    remove后list的项:7
    ==========remove后的list==========
    i的值:0 对应的数字:0
    i的值:1 对应的数字:1
    i的值:2 对应的数字:2
    i的值:3 对应的数字:4
    i的值:4 对应的数字:5
    i的值:5 对应的数字:6
    i的值:6 对应的数字:7

    可以看到没有删除前, 我们的list的项和循环对应的数字都是正确的, 但是下面的循环在删除第4个元素后,第4,5,6个项对应的数字本应该是4,5,6, 但是这里却变成了5,6,7.

    原因是,我们删除第4项后,list的长度就变成7,而且,list会把第4项后面的值往前移一位, 也就是说,i=3时,list.get(i)=4,i=4时,list.get(i)=5,i=5时,list.get(i)=6,i=6时,list.get(i)=7..  我们再说的形象一点, 就是本来有8层糕点,依次是0-7,竖起来,大的在上,小的在下,我们从下往上数,数到第5个的时候,吃掉这一层糕点,这时,上面三层分别往下移了一层
    所以, 值为4的项我们根本没有循环到

    那有什么方法可以实现remove呢, 有个笨方法,是新建一个tempList, 把要删除的项全部add进去,最后用list.removeAll(tempList)实现 . 但是这里我们有更好的方法, 就是倒序删除

    Java技术迷

    还是上面的例子, 我们看代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    List<Integer> list = new ArrayList<Integer>();
    list.add(0);
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    list.add(5);
    list.add(6);
    list.add(7);
    //正常循环
    for (int i = 0; i < list.size(); i++) {
     System.out.println("i的值:" + i + " 对应的数字:" + list.get(i));
    }
    System.out.println("没有remove前list的项:"+list.size());
      
    //边循环边删除
    for (int i = list.size() -1 ; i >= 0; i--) {
     System.out.println("i的值 " + i + " 对应的数字 " + list.get(i));
     if(list.get(i) == 3) list.remove(list.get(i));
    }
    System.out.println("remove后list的项:"+list.size());
      
    System.out.println("==========remove后的list==========");
    for (int i = 0; i < list.size(); i++) {
     System.out.println("i的值 " + i + " 对应的数字 " + list.get(i));
    }

    执行代码,结果如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    i的值:0 对应的数字:0
    i的值:1 对应的数字:1
    i的值:2 对应的数字:2
    i的值:3 对应的数字:3
    i的值:4 对应的数字:4
    i的值:5 对应的数字:5
    i的值:6 对应的数字:6
    i的值:7 对应的数字:7
    没有remove前list的项:8
    i的值 7 对应的数字 7
    i的值 6 对应的数字 6
    i的值 5 对应的数字 5
    i的值 4 对应的数字 4
    i的值 3 对应的数字 3
    i的值 2 对应的数字 2
    i的值 1 对应的数字 1
    i的值 0 对应的数字 0
    remove后list的项:7
    ==========remove后的list==========
    i的值 0 对应的数字 0
    i的值 1 对应的数字 1
    i的值 2 对应的数字 2
    i的值 3 对应的数字 4
    i的值 4 对应的数字 5
    i的值 5 对应的数字 6
    i的值 6 对应的数字 7

    我们可以看到变循环变删除,并不影响后面的元素, remove后的list也和第一次的结果是一样的 . 这是因为我们删除list元素,list的长度是会变小, 但是变化的只是比当前被删除元素的项大的项, 而我们这里使用倒序循环, 大的项, 我们已经执行过了, 所以不会影响.. 再用上面的比喻来说明,这次我们是从上往下数,数到第4个的时候,吃掉这一层糕点,这时,上面三层分别往下移了一层 , 但是这不影响我们之前数过的蛋糕, 而且对下面的蛋糕也不影响, 这就是原理

    总结

    以上就是本文关于ArrayList在for循环中使用remove方法移除元素方法介绍的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:Java实现跳跃表(skiplist)的简单实例   Java多线程ForkJoinPool实例详解  等。感谢朋友们对脚本之家网站的支持。有什么问题或者想要了解的可以随时给我们留言,小编会及时回复大家的。

                            <div class="art_xg">
                                <b>您可能感兴趣的文章:</b><ul><li><a href="/article/25489.htm" title="关于Ext中form移除textfield方法:hide(),setVisible(false),remove()" target="_blank">关于Ext中form移除textfield方法:hide(),setVisible(false),remove()</a></li><li><a href="/article/22807.htm" title="ExtJS TabPanel beforeremove beforeclose使用说明" target="_blank">ExtJS TabPanel beforeremove beforeclose使用说明</a></li></ul>
                            </div>
    
                        </div>
  • 相关阅读:
    Documentum之基础(1)
    tomcat部署项目,war包问题[转]
    AD与LDAP区别
    Microsoft Visual Studio2010--此时无足够的可用内存,无法满足操作的预期要求,可能是由于虚拟地址空间碎片造成的。请稍后重试。
    Oracle 11g服务器安装详细步骤
    Oracle 11g 密码永不过期设置
    oracle 11g dbf数据文件从C盘迁移到D盘
    Swift 简介
    0Day 密码重置dede阿帕奇强制安装
    PS抠图教程_抠图小技巧_常用抠图小技巧_图片结构与配色
  • 原文地址:https://www.cnblogs.com/sunny3158/p/14978868.html
Copyright © 2011-2022 走看看