集合常用算法工具

@Slf4j
public class MathUtil {
    /**
     * list 求差集
     *
     * @param n
     * @param m
     * @param <T>
     * @return
     */
    public static <T> List<T> getDifferenceSet(List<T> n, List<T> m) {
        //转化最长列表
        Set<T> set = new HashSet<>(n.size() > m.size() ? n : m);
        //循环最短列表
        for (T t : n.size() > m.size() ? m : n) {
            if (set.contains(t)) {
                set.remove(t);
            } else {
                set.add(t);
            }
        }
        return new ArrayList<>(set);
    }

    /**
     * list 求交集
     *
     * @param n
     * @param m
     * @param <T>
     * @return
     */
    public static <T> List<T> getIntersection(List<T> n, List<T> m) {
        Set<T> setN = new HashSet<>(n);
        Set<T> setM = new HashSet<>(m);
        setN.retainAll(setM);
        return new ArrayList<>(setN);
    }

    /**
     * list 集合并集
     *
     * @param n
     * @param m
     * @param <T>
     * @return
     */
    public static <T> List<T> getUnion(List<T> n, List<T> m) {
        Set<T> setN = new HashSet<>(n);
        Set<T> setM = new HashSet<>(m);
        setN.addAll(setM);
        return new ArrayList<>(setN);
    }


    /**
     * list 集合减法
     *
     * @param minute
     * @param minus
     * @param <T>
     * @return
     */
    public static <T> List<T> getSubtraction(List<T> minute, List<T> minus) {
        List<T> intersection = MathUtil.getIntersection(minute, minus);
        return MathUtil.getDifferenceSet(minute, intersection);
    }

    /**
     * 数组求差集
     *
     * @param n
     * @param m
     * @param <T>
     * @return
     */
    public static <T> T[] getDifferenceSet(T[] n, T[] m) {
        List<T> list = MathUtil.getDifferenceSet(Arrays.asList(n), Arrays.asList(m));
        return list.toArray(Arrays.copyOf(n, list.size()));
    }

    /**
     * 数组求交集
     *
     * @param n
     * @param m
     * @param <T>
     * @return
     */
    public static <T> T[] getIntersection(T[] n, T[] m) {
        List<T> list = MathUtil.getIntersection(Arrays.asList(n), Arrays.asList(m));
        return list.toArray(Arrays.copyOf(n, list.size()));
    }

    /**
     * 数组并集
     *
     * @param n
     * @param m
     * @param <T>
     * @return
     */
    public static <T> T[] getUnion(T[] n, T[] m) {
        List<T> list = MathUtil.getUnion(Arrays.asList(n), Arrays.asList(m));
        return list.toArray(Arrays.copyOf(n, list.size()));
    }

    /**
     * 数组减法
     *
     * @param minute
     * @param minus
     * @param <T>
     * @return
     */
    public static <T> T[] getSubtraction(T[] minute, T[] minus) {
        T[] intersection = MathUtil.getIntersection(minute, minus);
        return MathUtil.getDifferenceSet(minute, intersection);
    }

    public static void main(String[] args) {
        List<Integer> listA = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
        List<Integer> listB = new ArrayList<>(Arrays.asList(3, 4, 5, 6));
        log.info("初始化:listA=" + listA + ", listB=" + listB);
        log.info("list 差集" + getDifferenceSet(listA, listB));
        log.info("list 并集" + getUnion(listA, listB));
        log.info("list 交集" + getIntersection(listA, listB));
        log.info("list 减集" + getSubtraction(listA, listB));
        log.info("操作后:listA=" + listA + ", listB=" + listB);
        Integer[] arrayA = new Integer[]{1, 2, 3, 4};
        Integer[] arrayB = new Integer[]{3, 4, 5, 6};
        log.info("初始化:arrayA=" + Arrays.toString(arrayA) + ", arrayB=" + Arrays.toString(arrayB));
        //差集[1, 2, 5, 6]
        log.info("array 差集" + Arrays.toString(getDifferenceSet(arrayA, arrayB)));
        //并集[1, 2, 3, 4, 5, 6]
        log.info("array 并集" + Arrays.toString(getUnion(arrayA, arrayB)));
        //交集[3, 4]
        log.info("array 交集" + Arrays.toString(getIntersection(arrayA, arrayB)));
        //交集[3, 4]
        log.info("array 减集" + Arrays.toString(getSubtraction(arrayA, arrayB)));
        log.info("操作后:arrayA=" + Arrays.toString(arrayA) + ", arrayB=" + Arrays.toString(arrayB));
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值