zoukankan      html  css  js  c++  java
  • 【Java】【28】提高List的removeAll方法的效率

    前言:

    removeAll方法是取差集的,数据量很大的时候效率很低。

    removeAll方法定义可见我的博客【Java】【27】

    本文的最终方案是方法3

    正文:

    原集合:List<T> source

    目标集合:List<T> destination

    要求:取原集合中,不与目标集合重复的元素

    1,资料表明,给List中add()数据的速度要比从List中remove()数据的快。效果不明显

    public List<T> removeAll_01(List<T> source, List<T> destination) {
        List<T> result = new LinkedList<T>();
        for(T t : source) {
            if (!destination.contains(t)) {
                result.add(t);
            }
        }
        return result;
    }

    2,运用Set可以去重这一特性。效率有明显提升

    public List<T> removeAll_02(List<T> source, List<T> destination) {
        List<T> result = new LinkedList<T>();
    
        Map<T, Integer> sourceMap = new HashMap<T, Integer>();
        for (T t : source) {
            if (sourceMap.containsKey(t)) { //原集合中的重复值
                sourceMap.put(t, sourceMap.get(t) + 1);
            } else {
                sourceMap.put(t, 1);
            }
        }
    
        Set<T> all = new HashSet<T>(destination);
        for (Map.Entry<T, Integer> entry : sourceMap.entrySet()) {
            T key = entry.getKey();
            Integer value = entry.getValue();
            if (all.add(key)) {
                for (int i = 0; i < value; i++) {
                    result.add(key);
                }
            }
        }
        return result;
    }

    3,用Set.contains()再优化

    public List<T> removeAll_03(List<T> source, List<T> destination) {
        List<T> result = new LinkedList<T>();
        Set<T> destinationSet = new HashSet<T>(destination);
        for(T t : source) {
            if (!destinationSet.contains(t)) {
                result.add(t);
            }
        }
        return result;
    }

    参考博客:

    List 的 removeAll 方法的效率 - kangxingang的专栏 - CSDN博客
    https://blog.csdn.net/kangxingang/article/details/9033491

  • 相关阅读:
    练习44-继承和组合
    CF 1329B Dreamoon Likes Sequences
    CF 1362C Johnny and Another Rating Drop
    CF 1391D 505
    CF 1383B GameGame
    CF1360F Spy-string(暴力)
    Java 之 关键字与标识符
    Java 之 Java 注释与 API
    Java 之 第一个Java程序
    Java 之 Java开发环境
  • 原文地址:https://www.cnblogs.com/huashengweilong/p/10965427.html
Copyright © 2011-2022 走看看