手记

【Java小收获】List一次删除多个元素

正文之前

今天还在执着的肝论文,EADC这个理论上的简单算法, 我活活肝了三天,虽然大部分时间在划水,但是也可见我真是个渣渣,今天遇到一个小问题。那就是如何在List中一次删除多个元素?因为我们删除掉一个元素之后,后面的元素的索引都会变化。所以还有另外的搞法,当然,我也有自己的看法

正文

ArrayList类是List接口的实现类,同时List接口是Collection接口的子接口。其删除方法分为带索引号 index 和不带索引两种

  • 1、remove( Object );removeAll( Collection ) //删除指定元素或集合,返回布尔值

  • 2、remove( index );//删除指定索引位置的元素,返回删除的元素</pre>

那么显而易见的,当我们在遍历的时候,是不能这么搞得对吧?就算可以!也别这么干,很危险啊,C++里面绝对不容许这么干的。那么Java里边也别这么干吧,所以还是先把要删除的索引用一个ArrayList存起来,(把满足要求的数据放到另一个集合里,)最后统一删除,就不会漏删了!!!!

看我的:

    public static void Clear(ArrayList<Area> allArea){
        ArrayList<Area> del = new ArrayList<>();        for (int s = 0;s<allArea.size();++s) {            if (allArea.get(s).getCount() == 0){                if (s>0) {
                    allArea.get(s - 1).merge(allArea.get(s));
                    del.add(allArea.get(s));
                }                continue;
            }
        }
        allArea.removeAll(del);
    }

这个方法就是专门用来删除在ArrayList<Area> allArea中size为0的空的Area的。可以看到,我用一个del存着所有要删除的项目,然后一把删除。。怎么样?不错吧?


不过其实吧,我觉得也可以用索引来删除,不过要从后面开始删起,而且不能是对要删除的ArrayList进行遍历,而是对我们的删除索引集合进行遍历:

    public static void Clear(ArrayList<Area> allArea){
        ArrayList<Integer> del = new ArrayList<>();        for (int s = 0;s<allArea.size();++s) {            if (allArea.get(s).getCount() == 0){                if (s>0) {
                    allArea.get(s - 1).merge(allArea.get(s));
                    del.add(s);
                }                continue;
            }
        }        for(int i=del.size()-1;i>=0;--i){
            allArea.remove(del.get(i));
        }
        allArea.removeAll(del);
    }

下面这法子从均值上来说还慢一点。。。好吧,果然还是官方爸爸厉害啊!!

溜了!这就是删除的法子,还蛮好用的!

正文之后

感觉EADC算法应该快写完了!到时候再发一篇总结一下这个工作的文章。不过肯定要查重后了。我还打算靠着这点原创代码凑字数呢。。。



作者:HustWolf
链接:https://www.jianshu.com/p/561b8a47c435


0人推荐
随时随地看视频
慕课网APP