首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

arrayList 的removeAll效率有关问题

2012-12-23 
arrayList的removeAll效率问题我有两个list,listA和listB,想分别去掉两个list相同的部分,调用listA.remove

arrayList 的removeAll效率问题
我有两个list,listA和listB,想分别去掉两个list相同的部分,调用listA.removeAll(listB)可以得到解决,可以list的大小上万以后,运行的速度很慢,我换用linkedList,好像速度提升的不是很明显,不知哪位大侠有好的方法指导下?
[解决办法]
把两个list中的数据取出来放到一个HashSet中


[解决办法]

引用:
把两个list中的数据取出来放到一个HashSet中


如果存的是对象,需要重写对象的hashcode和equals方法。
[解决办法]
1、遍历list1到中间队列或者map,并设置标记(就是累加每个对象的数量)
2、遍历list2到上述的中间队列或者map,并设置标记(就是累加每个对象的数量)
3、遍历中间队列或者map的key(也就是keySet),判断标记,如果标记大于1,删除此对象
4、剩下的就是你要的结果。
[解决办法]
引用:
1、遍历list1到中间队列或者map,并设置标记(就是累加每个对象的数量)
2、遍历list2到上述的中间队列或者map,并设置标记(就是累加每个对象的数量)
3、遍历中间队列或者map的key(也就是keySet),判断标记,如果标记大于1,删除此对象
4、剩下的就是你要的结果。


这个貌似只是解决了前面的问题。
后面的A和Blist还没有相减。。。。去重。。。


后面那个没看到源码不知道为什么性能不行。。建议楼猪童鞋看看源码。。。。(因为找了好长时间没找到其中的源码。。楼猪童鞋自己慢慢找找。。找到了引用我一下。。3颗屎。、。)









[解决办法]
java 做这个,怎么都快不了,native的方法是最快的了
[解决办法]
在我本机测试, 挺快的. 但有一个问题, 如果原来的list里面有重复的数字, 都被清除了, 不知道这个对你的具体问题有没有影响.


    public static void main(String[] args) {
        int max_len = 50000;
        ArrayList<Integer> list1 = new ArrayList<Integer>();
        ArrayList<Integer> list2 = new ArrayList<Integer>();
        for (int i=0; i<max_len; i++) {
            list1.add((int)(Math.random()*max_len));
            list2.add((max_len/2)+(int)(Math.random()*max_len));
        }
        
        System.out.printf("list1:%d, list2:%d\n", list1.size(), list2.size());
        long start = System.currentTimeMillis();
        
        HashSet<Integer> set_all = new HashSet<Integer>();
        for (int i=0; i<list1.size(); i++) {
            set_all.add(list1.get(i));
        }
        HashSet<Integer> set_dup = new HashSet<Integer>();
        ArrayList<Integer> list2_clean = new ArrayList<Integer>();
        for (int i=0; i<list2.size(); i++) {
            if (set_all.add(list2.get(i))) {  //in list2 but not in list1
                list2_clean.add(list2.get(i));


            } else {
                set_dup.add(list2.get(i));  //in list2 and also in list1
            }
        }
        ArrayList<Integer> list1_clean = new ArrayList<Integer>();
        for (int i=0; i<list1.size(); i++) {
            if (set_dup.add(list1.get(i))) {  //in list1 but not in the duplicated set
                list1_clean.add(list1.get(i));
            }
        }
        
        long end = System.currentTimeMillis();
        System.out.printf("list1 clean:%d, list2 clean:%d\n", list1_clean.size(), list2_clean.size());
        System.out.printf("time spent : %dms\n", end-start);
    }

热点排行