欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > > 文章正文

ArrayList 删除指定值,arraylist指定值

来源: javaer 分享于  点击 21041 次 点评:121

ArrayList 删除指定值,arraylist指定值


现在有这么一个需求,删除数组中值为1的项,这个问题看起来非常简单,可实际上非常容易出错,而且很有可能自己都没发现,一般我们是这么处理的:

初始化10万条数据:

for (int i = 0; i < 100000; i++) {
            list.add(i % 10);
        }

删除 =1 的项:

for (int i = 0; i < list.size(); i++) {
            if (list.get(i) == 1) {
                list.remove(i);
            }
        }

运行结果:


我们一看没问题啊,我们以为已经解决了,如果我们删除1和2的值,

for (int i = 0; i < list.size(); i++) {
            if (list.get(i) == 1 || list.get(i) == 2) {
                list.remove(i);
            }
        }

你会发现怎么指删除了10000条数据啊,怎么和只删除1的结果一样啊,你的第一反应是不是代码写错了,于是又看了看,没错啊,这个 时候我们就要好好分析下了:

数据集合:[0,1,2,3,4,5,6,7,8,9,0,1….]
第一步:i=0,list.get(i) =0,过。

第二步:i=1,list.get(i) =1,删除当前项,
此时的数据集合变为:[0,2,3,4,5,6,7,8,9,0,1….]
第三步:i=2,list.get(i) =3,就是这看好了,由于删除了一项导致列表发 生变化,使原数据的第三项跳过了。

到这里我们已经明白为什么出错了,找到了原因解决起来也就比较简单了我总结了几个解决方法:
1、递归方法,就是每次删除后重新开始:

private void delete1(){
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i) == 1 || list.get(i) == 2) {
                list.remove(i);
                delete1();
            }
        }
    }


这种方法其实我不想介绍的,不过后来想想我们可以当成反面教材嘛,这种方法效率惨不忍睹,任何时候不到万不得已千万不要用递归。

2、根据出错的分析我们可以在删除时执行i–:

for (int i = 0; i < list.size(); i++) {
            if (list.get(i) == 1 || list.get(i) == 2) {
                list.remove(i);
                i--;
            }
        }

3、倒叙执行:

for (int i = list.size() - 1; i >= 0; i--) {
            if (list.get(i) == 1 || list.get(i) == 2) {
                list.remove(i);
            }
        }

4、使用Iterator

Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
            int item = iterator.next();
            if (item == 1 || item == 2) {
                iterator.remove();
            }
        }


使用2、3、4都可以达到我们想要的效果,从10万条数据测试的效率来看都在800ms左右,不过我还是建议使用Iterator。

希望对大家有帮助,如果有什么问题评论留言,有更好的办法希望大家在评论分享下,我们共同进步。

相关文章

    暂无相关文章

用户点评