List<Bean> list = new ArrayList<Bean>();Bean里面有个属性id,把id等于1的全部删掉;这个list里可能有很多数据,请问高手们要怎么删除才最有效率?

解决方案 »

  1.   

    只能for循环,最好就是放进list之前就过滤。
      

  2.   

    再顶最后一下,再没高手解答我就for循环了  - -!
      

  3.   

    删除的时候最耗时就是内存移动。如果删除的
    for如果从最后的元素先前遍历删除,比从最前向最后遍历删除理论上移动的记录要少点,要快一点。如果删除太多建议直接用linkedlist会快点。
      

  4.   

    LinkedList是链表数据结构,如果是增加删除操作,用LinkedList不需要像ArrayList那样移动数组,所以更高效不过楼主你的问题是想怎样根据id删List里面的对象更快是么?如果ID是唯一索引那样还不如用Map来做数据容器更方便你的这种操作
    eg:Map<Long,Bean> map = new Map<Long,Bean>();
      

  5.   

    有一个算法,应该更有效的规避无效的内存移动:
    1)定义两个下标变量i,j都指向List的初始下标0,
    2)判断i的位置是否是要删除的元素,如果是j先下移看j的下标处元素是否应该删除,如果是则j继续
    向下移动,遇到不要删除的记录是把j处元素拷贝到i处同时i++,j++。重复上面的操作直到遍历完
    整个列表
    3)循环判断List.size > i + 1,每次循环删除List的最后一个元素。end~~
      

  6.   

    那个list是个参数传过来的,我也不能随便改,总之谢谢了各位了
      

  7.   

    下面是按照上面的思路写的实现代码,并附上测试代码。测试结果表明这种思路还是可取的:package csdn;import java.util.ArrayList;
    import java.util.List;public class HighEffectDelete {    public static void main(String[] args) {
            List<Integer> list = new ArrayList<Integer>();
            for (int i = 0; i < 100000; i++) {
                list.add(i);
                if (i % 10 == 0)
                    list.add(0);
            }        Long start = System.currentTimeMillis();
            effectiveDelete(list, 0);
            //normalDelete(list, 0);
            System.out.println((System.currentTimeMillis() - start));
        }    public static void normalDelete(List<Integer> list, Object key) {
            for (int i = list.size() - 1; i > -1; i--) {
                if (key.equals(list.get(i)))
                    list.remove(i);
            }
        }    public static void effectiveDelete(List<Integer> list, Object key) {
            int i = 0, j = 0, size = list.size();
            while (j < size) {
                Integer elem = list.get(j);
                if (key.equals(elem)) {
                    for (j = j + 1; j < size && key.equals(list.get(j)); j++)
                        ;                while (j < size) {
                        Integer o = list.get(j);
                        if (!key.equals(o)) {
                            list.set(i, o);
                            i++;
                            j++;
                        } else {
                            break;
                        }
                    }
                } else {
                    i++;
                    j++;
                }
            }        for (int k = size - 1; k >= i; k--) {
                list.remove(k);
            }
        }}normalDelete的时间要远大于effectiveDelete,effectiveDelete可以实现100万级删除,而normalDelete在10万级的测试中性能已经不能接受了。