美文网首页
大量数据的集合去重-->效率

大量数据的集合去重-->效率

作者: 巧克力er | 来源:发表于2017-11-23 17:59 被阅读0次

作者:巧克力er

坐标:江苏 南京

场景:
有两个数据量很大的集合 list1, list2,现在需要去掉两个集合中都存在的数据。

方法一:一个最常见的方法

public class Collex {
    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();
        
        List<Integer> list1Copy = new ArrayList<Integer>(list1);
        list1.removeAll(list2);
        list2.removeAll(list1Copy);
        long end = System.currentTimeMillis();
        System.out.printf("list1 clean:%d, list2 clean:%d\n", list1.size(), list2.size());
        System.out.printf("time spent : %dms\n", end-start);
    }
}

方法一结果展示:

list1:50000, list2:50000
list1 clean:34004, list2 clean:34063
time spent : 12346ms

方法二:

public class CollectionCompire {

    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);
    }
}

方法二结果展示:

list1:50000, list2:50000
list1 clean:21709, list2 clean:21613
time spent : 67ms

这里可以看出看来当集合的数据量达到50000的时候,方法一的耗时要远远大于方法二。

相关文章

  • 大量数据的集合去重-->效率

    作者:巧克力er坐标:江苏 南京 场景:有两个数据量很大的集合 list1, list2,现在需要去掉两个集合中都...

  • java 两个数组去除重复的值,结果第一个数组去掉第二个数组中重

    这个方法对于大量数据,效率低下,最近更新了一篇利用Set 去重。

  • 大量数据去重方案

    数据库中有有一张表专门存储用户的维度数据,由于随着时间的推移,用户的维度数据也可能发生变化,故每一次查看都会保存一...

  • 大数据List去重

    MaxList模块主要是对Java集合大数据去重的相关介绍。 背景: 最近在项目中遇到了List集合中的数据要去重...

  • Java集合去重的几种方法

    一、基础数据类型集合去重: 例:String 方法实现: 二、对象根据指定属性去重

  • 写了这么多代码,你还不会去重实体类 ?

    引言 日常 coding 中经常遇到实体的集合,需要进行去重,一般都是交给java来执行,效率快,还不用操作数据库...

  • 7、集合

    集合 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测...

  • Java集合精讲

    集合(Collection) 集合的本质是存放大量数据的容器,作用与数组是一样的,用来保存大量相同类型的数据。集合...

  • Python Day03

    集合操作: ·去重,把一个列表边城集合,就自动去重 ·关系测试,测试两组数据之前的交集、差集、并集等关系 ...

  • 数据结构与算法必知--- Bitmap位图与布隆过滤器

    写在前 bitmap和布隆过滤器主要解决大数据去重的问题。用于对大量整型数据做去重和查询。其实如果并非如此大量的数...

网友评论

      本文标题:大量数据的集合去重-->效率

      本文链接:https://www.haomeiwen.com/subject/nxxtbxtx.html