正文之前
今天还在执着的肝论文,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