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

  • 相关阅读:
    Codeforces 424C(异或)
    CodeForces
    Codeforces 424A (思维题)
    HDU 1197 Specialized Four-Digit Numbers
    ZOJ 2301 Color the Ball 线段树(区间更新+离散化)
    HDU 1106 排序
    Codefroces 831B Keyboard Layouts
    POJ 1082 Calendar Game
    HDU 多校联合 6045
    HDU 5976 Detachment
  • 原文地址:https://www.cnblogs.com/huashengweilong/p/10965427.html
Copyright © 2011-2022 走看看