封装一个比较集合的工具类

公司业务需要自己封装的一个工具类

ListUtils

public class ListUtils {
    public ListUtils() {
    }

    public static <T> ListUtils.Differ<T> sameAndDiff(List<T> leftList, List<T> rightList, 
DiffDataAdapter<T> diffDataAdapter) {
        ListUtils.Differ<T> differ = new ListUtils.Differ();
        List<T> identicalList = new ArrayList();
        List<T> leftDiffList = new ArrayList();
        List<T> rightDiffList = new ArrayList();
        if (CollectionUtils.isEmpty(leftList) && CollectionUtils.isEmpty(rightList)) {
            return differ;
        } else {
            Iterator var11;
            Object t;
            if (CollectionUtils.isEmpty(leftList)) {
                var11 = rightList.iterator();

                while(var11.hasNext()) {
                    t = var11.next();
                    diffDataAdapter.onRightDiff(t);
                }

                differ.setRightDiffs(rightList);
                return differ;
            } else if (CollectionUtils.isEmpty(rightList)) {
                var11 = leftList.iterator();

                while(var11.hasNext()) {
                    t = var11.next();
                    diffDataAdapter.onLeftDiff(t);
                }

                differ.setLeftDiffs(leftList);
                return differ;
            } else {
                Map<String, T> rightMap = new ConcurrentHashMap();
                Iterator var8 = rightList.iterator();

                Object left;
                while(var8.hasNext()) {
                    left = var8.next();
                    rightMap.put(diffDataAdapter.renderKey(left), left);
                }

                var8 = leftList.iterator();

                while(var8.hasNext()) {
                    left = var8.next();
                    String key = diffDataAdapter.renderKey(left);
                    if (StringUtils.isEmpty(key)) {
                        diffDataAdapter.onLeftDiff(left);
                        leftDiffList.add(left);
                    } else if (rightMap.containsKey(key)) {
                        diffDataAdapter.onIdentical(left, rightMap.get(key));
                        identicalList.add(left);
                        rightMap.remove(key);
                    } else {
                        diffDataAdapter.onLeftDiff(left);
                        leftDiffList.add(left);
                    }
                }

                if (!rightMap.isEmpty()) {
                    var8 = rightMap.entrySet().iterator();

                    while(var8.hasNext()) {
                        Entry<String, T> entry = (Entry)var8.next();
                        diffDataAdapter.onRightDiff(entry.getValue());
                        rightDiffList.add(entry.getValue());
                    }
                }

                differ.setLeftDiffs(leftDiffList);
                differ.setRightDiffs(rightDiffList);
                differ.setIdenticals(identicalList);
                return differ;
            }
        }
    }

    public static class Differ<T> {
        private List<T> leftDiffs;
        private List<T> rightDiffs;
        private List<T> identicals;

        public Differ() {
        }

        public List<T> getLeftDiffs() {
            return this.leftDiffs;
        }

        public List<T> getRightDiffs() {
            return this.rightDiffs;
        }

        public List<T> getIdenticals() {
            return this.identicals;
        }

        public void setLeftDiffs(List<T> leftDiffs) {
            this.leftDiffs = leftDiffs;
        }

        public void setRightDiffs(List<T> rightDiffs) {
            this.rightDiffs = rightDiffs;
        }

        public void setIdenticals(List<T> identicals) {
            this.identicals = identicals;
        }
    }
}

DiffDataAdapter

public abstract class DiffDataAdapter<T> {
    public DiffDataAdapter() {
    }

    protected String renderKey(T t) {
        String key = this.compareKey(t);
        return key;
    }

    protected abstract String compareKey(T var1);

    protected void onLeftDiff(T left) {
    }

    protected void onRightDiff(T right) {
    }

    protected void onIdentical(T left, T right) {
        if (left != null || right != null) {
            ;
        }
    }
}

Set<String> result1 = Sets.union(set1, set2);           //并集
Set<String> result2 = Sets.intersection(set1, set2);  //交集
Set<String> result3 = Sets.difference(set1, set2);     //差集 1中有而2中没有的
Set<String> result4 = Sets.symmetricDifference(set1, set2); //相对差集 1中有2中没有 2中有1中没有的 取出来做结果
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,246评论 4 61
  • 我总是分不清主次 走着走着就躺下了 是的 在荒芜的街头 我躺下了 成了你的座右铭。
    留子尧阅读 167评论 0 3
  • 定时器的两种简单实现方式: 1.timer 2.GCD 上面两种方法以及实现简单的定时器,但是还有一个隐藏的问题,...
    oncezou阅读 13,654评论 0 12
  • 有一本很有名的书叫做《爱的五种语言》是盖瑞·查普曼的作品,副标题是创造完美两性沟通。 看到《爱的五种能力》这本书,...
    朱笋笋阅读 1,895评论 0 13