美文网首页
高效率的集合交集(差集)处理方式

高效率的集合交集(差集)处理方式

作者: KingdomCoder | 来源:发表于2020-05-07 10:54 被阅读0次

我们在业务上难免会遇到集合交集的处理,这边总结了几种方式比较,然后寻求最优的方式。当然如果集合数据比较少的情况下,选取的方式基本都能满足需求,但是如果在数据量比较大的情况下呢?如果选取的方式不好,那么效率就会及其的低下。下面我们就集中方式展开分析。

ArrayList原生接口retainAll(c)方式

    public static void main(String[] args) {
        
        List<String> list1 = new ArrayList<String>();
        List<String> list2 = new ArrayList<String>();
        List<String> r = new ArrayList<>();
        // 初始化数据
        for (int i = 0; i < 30000; i++) {
            list1.add("test" + i);
            list2.add("test" + i * 3);
        }
        System.out.println("添加完成");
        long t = System.currentTimeMillis();
        list1.retainAll(list2);
        System.out.println(System.currentTimeMillis() - t);
    }

我们执行上述代码,我们一个集合3w的数据,耗时时间基本都是在9s左右。

通过list遍历contains判定方式

  public static void main(String[] args) {


        List<String> list1 = new ArrayList<String>();
        List<String> list2 = new ArrayList<String>();
        List<String> r = new ArrayList<>();
        for (int i = 0; i < 30000; i++) {
            list1.add("test" + i);
            list2.add("test" + i * 3);
        }
        System.out.println("添加完成");
        long t = System.currentTimeMillis();

        list1.stream().forEach(s->{
            if(list2.contains(s)){
                r.add(s);
            }
        });

        System.out.println(System.currentTimeMillis() - t);

    }

跟原生api的方式比较,效率差不多,通过代码分析,原生api也是采用的是集合遍历然后contains判定的。

List转Map通过key来判定是否交叉

public static void main(String[] args) {


        List<String> list1 = new ArrayList<String>();
        List<String> list2 = new ArrayList<String>();
        List<String> r = new ArrayList<>();
        for (int i = 0; i < 30000; i++) {
            list1.add("test" + i);
            list2.add("test" + i * 3);
        }
        System.out.println("添加完成");
        long t = System.currentTimeMillis();


        Map<String, String> map1 = list1.stream().collect(toMap(s -> s, Function.<String>identity()));
        list2.stream().forEach(s -> {
            String ss = map1.get(s);
            if (ss != null) {
                r.add(ss);
            }
        });

        System.out.println(System.currentTimeMillis() - t);
    }

执行代码跟上面两种方式相比,效率是相当的高,两个数组都在3W级别的数量集,基本保持在100ms左右即可完成。

相关文章

  • 高效率的集合交集(差集)处理方式

    我们在业务上难免会遇到集合交集的处理,这边总结了几种方式比较,然后寻求最优的方式。当然如果集合数据比较少的情况下,...

  • 抽象代数简介

    集合 交集·并集·差集 在中学阶段就学习过集合,部分内容不再赘述。以下是交集、并集、差集的概念: 幂集 设是一个集...

  • Guava 学习

    guava Splitter 学习 guava Sets 集合类取交集、差集、并集

  • Python set集合

    本文目录 set集合的基本用法 set集合的创建 Set集合的交集&并集&差集 set的集合推导式 set集合的常...

  • 集合运算

    集合运算: 并集: union (只取一遍)/union all (交集取两遍) 交集: intersect 差集...

  • Python精简入门学习(十三)

    Python精简入门学习之集合 -set -创建集合 -添加操作 -清空操作 -差集操作 -交集操作 -并集操作 ...

  • 学习js数据结构与算法4—集合

    集合 集合是由一组无序且唯一的项组成的 6.1 创建一个集合 6.2 集合操作 并集,交集,差集,子集

  • 利用set集合快速高效求交集、并集、差集

    1、求两个集合的交集: 结果: 1、求两个集合的并集: 结果: 3、求两个集合的差集: 结果:

  • Java求两个List集合的交集、并集、差集

    在项目中经常会求解集合的交集、并集、差集,这里做个记录。首先创建两个集合list1、list2以及添加元素。 交集...

  • javaScript数据结构--集合

    集合是由一组无序且唯一的项组成的: 集合可以进行 并集、交集、差集、子集操作。 集合的代码实现: function...

网友评论

      本文标题:高效率的集合交集(差集)处理方式

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