正文之前
今天还在执着的肝论文,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算法应该快写完了!到时候再发一篇总结一下这个工作的文章。不过肯定要查重后了。我还打算靠着这点原创代码凑字数呢。。。
网友评论