不灭的焱

革命尚未成功,同志仍须努力

作者:php-note.com  发布于:2019-02-23 17:30  分类:Java  编辑

Java 数组 ArrayList 常用操作:并集、交集、差集、去重、反转

 

package wen.jianbao.helper;

import java.util.*;

/**
 * ArrayList 助手类
 */
public class ArrayListHelper {
    /**
     * 并集
     */
    @SafeVarargs
    public static <T> ArrayList<T> merge(final ArrayList<T>... lists) {
        if (lists.length == 0) {
            return null;
        }
        ArrayList<T> mergeList = new ArrayList<>();
        for (ArrayList<T> list : lists) {
            mergeList.addAll(list);
        }

        return mergeList;
    }

    /**
     * 交集
     * 相同的元素
     */
    @SafeVarargs
    public static <T> ArrayList<T> intersect(final ArrayList<T>... lists) {
        if (lists.length == 0) {
            return null;
        }

        ArrayList<T> intersectList = new ArrayList<>();

        // 生成一组以数组元素为key,相同元素的个数为value的中间键值对
        HashMap<T, Integer> hashMap = new HashMap<>();
        for (ArrayList<T> list : lists) {
            for (T item : list) {
                if (hashMap.containsKey(item)) {
                    hashMap.put(item, hashMap.get(item) + 1);
                } else {
                    hashMap.put(item, 1);
                }
            }
        }

        // 统计出相同元素个数正好是数组(参数)个数的元素,即每个数组中都有的元素
        for (Map.Entry<T, Integer> entry : hashMap.entrySet()) {
            if (entry.getValue() == lists.length) {
                intersectList.add(entry.getKey());
            }
        }

        return intersectList;
    }

    /**
     * 差集
     * 属于 list1 而不属于 list2, list3, list4...
     */
    @SafeVarargs
    public static <T> ArrayList<T> diff(final ArrayList<T>... lists) {
        if (lists.length == 0) {
            return null;
        }

        ArrayList<T> diffList = new ArrayList<>();

        // 生成一组以数组元素为key,相同元素的个数为value的中间键值对
        HashMap<T, Integer> hashMap = new HashMap<>();
        for (int i = 0; i < lists.length; i++) {
            if (i == 0) {
                for (T item : lists[i]) {
                    hashMap.put(item, 1);
                }
            } else {
                for (T item : lists[i]) {
                    if (hashMap.containsKey(item)) {
                        hashMap.put(item, hashMap.get(item) + 1);
                    }
                }
            }

        }

        // 统计出相同元素个数为1的元素,即只在第一个数组中出现的元素
        for (Map.Entry<T, Integer> entry : hashMap.entrySet()) {
            if (entry.getValue() == 1) {
                diffList.add(entry.getKey());
            }
        }

        return diffList;
    }


    /**
     * 去重
     * 无重复并集
     */
    public static <T> ArrayList<T> unique(final ArrayList<T> list) {
        if (list == null) {
            return null;
        }

        Set<T> hashSet = new HashSet<>(list);
        return new ArrayList<>(hashSet);
    }

    /**
     * 反转
     * 如果允许直接改变原数组,可用Java自带方法 Collections.reverse()
     */
    public static  <T> ArrayList<T> reverse(final ArrayList<T> list) {
        if (list == null) {
            return null;
        }

        ArrayList<T> reverseList = new ArrayList<>();
        for (int i = list.size() - 1; i >= 0; i--) {
            reverseList.add(list.get(i));
        }

        return reverseList;
    }
}