数组工具类:求多个不定类型数组交集,并集,差集,合并去重,合并不去重

简介:

两个不定类型数组交集,两个数组并集,两个数组差集
多个数组交集,多个数组并集,多个数组差集
合并多个数组:去重,不去重
数组去重
获取两个数组元素更多(少)的数组
import java.lang.reflect.Array;
import java.util.*;

/**
 * Java数组常用工具类:
 * 两个数组交集,两个数组并集,两个数组差集
 * 多个数组交集,多个数组并集,多个数组差集
 * 合并多个数组:去重,不去重
 * 数组去重
 * 获取两个数组元素更多(少)的数组
 * -------------------
 * 数组排序
 */
public class ArrUtil {
    /**
     * 求不定数目个数组的交集
     * @param arr1
     * @param arr2
     * @param arrays
     * @param 
     * @return
     */
    public static  T[] getInterArr(T[] arr1, T[] arr2, T[]... arrays){
        T[] interArr = getInterArrTwo(arr1, arr2);
        for(T[] array : arrays){
            interArr = getInterArrTwo(interArr, array);
        }
        //set 集合转 数组   return (String[])moreSet.toArray(new String[0]);
        return interArr;
    }
    /**
     * 求两个个数组的交集
     * @param arr1
     * @param arr2
     * @param 
     * @return
     */
    public static  T[] getInterArrTwo(T[] arr1, T[] arr2){
        Set set = new HashSet(Arrays.asList(arr1));
        Set interSet = new HashSet();
        for(T ele : arr2){
            if(set.contains(ele)){
                interSet.add(ele);
            }
        }
        T[] tArr = (T[]) Object[].class.cast(Array.newInstance(arr1[0].getClass(), interSet.size()));
        //set 集合转 数组   return (String[])moreSet.toArray(new String[0]);
        return interSet.toArray(tArr);
    }

    /**
     * 求不定数目个数组的并集
     * @param arr1
     * @param arr2
     * @param arrays
     * @param 
     * @return
     */
    public static  T[] getUnionArr(T[] arr1, T[] arr2, T[]... arrays){
        T[] unionArr = mergeArraysNoRepeat(arr1, arr2);
        for(T[] array : arrays){
            unionArr = mergeArraysNoRepeat(unionArr, array);
        }
        return unionArr;
    }
    /**
     * 求多个不定类型数组的差集(就是长的)
     * @param arrays 变成参数(可以传入随意个数组)--》变长参数,实际就是一个数组,所以这里应该是一个二维数组
     * @param  泛型
     * @return
     */
    public static  T[] getDifArr(T[] arr1, T[] arr2, T[]... arrays){
        //先合并并去重
        T[] noRepeatArr = (T[]) mergeArraysNoRepeat(arr1, arr2);
        //获取差集
        T[] difArr = getDifArrTwo(arr1, arr2);
        //遍历二维数组,获取所有数组的差集
        for(T[] arr : arrays){
            //一定要先 获取去重的,和当前数组的差集以后,再将当前数组拿去去重(这样才不会漏掉)
            //获取两个数组的差集
            difArr = getDifArrTwo(noRepeatArr, arr);
            noRepeatArr = mergeArraysNoRepeat(noRepeatArr, arr);
        }
        return difArr;
    }

    /**
     * 获取两个数组的 差集
     * 注意: return (T[]) difSet.toArray(new Object[]{}); 会报错,类型转换错误。因为 泛型 T 和 Object 是不能直接转换的。要想转换,需要利用反射:
     *      T[] o = (T[]) Object[].class.cast(Array.newInstance(m, difSet.size()));  //Array.newInstance(Class class, int length) 表示知道 class,反射获取其 数组对象。class.cast(Object obj);表示将指定obj类型转换成指定class类型
     *      return difSet.toArray(o); //set转数组
     * @param arr1
     * @param arr2
     * @param 
     * @return
     */
    private static  T[] getDifArrTwo(T[] arr1, T[] arr2){
        //两个数组中,长度更长的数组
        T[] longerArr = getLongerArr(arr1, arr2);
        //两个数组中,长度更短的数组
        T[] shorterArr = getShorterArr(arr1, arr2);
        //差集的 set 集合,用 set 是因为 set 是不可重复的。
        Set difSet = new HashSet(Arrays.asList(longerArr));
        //遍历长度更短的集合
        Class tClass = null;
        for(T t : shorterArr){
            tClass = t.getClass();
            //如果差集中包含了该元素,删除掉(因为差集是 一个有,一个没有)
            if(difSet.contains(t)){
                difSet.remove(t);
            }else {
                difSet.add(t);
            }
        }
        //Class.cast(Object obj)方法 就是作用就是强制类型转换。将obj转化成T类型。
        //先使用 Array.newInstance(m, difSet.size()) 将 class 转换成数组,再使用 class 的 cast() 方法将 数组强制转换成 Object[] 类型的数组
        T[] tArr = (T[]) Object[].class.cast(Array.newInstance(tClass, difSet.size()));
        //set 集合转 数组   return (String[])moreSet.toArray(new String[0]);
        return difSet.toArray(tArr);
    }

    /**
     * 获取两个数组中更长的一个数组
     * @param arr1
     * @param arr2
     * @param 
     * @return
     */
    private static  T[] getLongerArr(T[] arr1, T[] arr2){
        return arr1.length >= arr2.length ? arr1 : arr2;
    }
    /**
     * 获取两个数组中更短的一个数组
     * @param arr1
     * @param arr2
     * @param 
     * @return
     */
    private static  T[] getShorterArr(T[] arr1, T[] arr2){
        return arr1.length < arr2.length ? arr1 : arr2;
    }

    /**
     * 合并 数组(不去重--》使用List集合来进行合并)
     * List 集合 可重复的特性来实现合并不去重
     * @param arr1
     * @param arrays
     * @param 
     * @return
     */
    public static  T[] mergeArrays(T[] arr1, T[]... arrays){
        //先创建一个泛型 list 集合(因为list 是允许重复的,可变长度的)
        List list = new ArrayList(Arrays.asList(arr1));
        //遍历可变长度参数(可变长度参数,底层就是一个数组),这里的每一个参数都是一个数组
        for(T[] array : arrays){
            //遍历每一个数组,将元素添加到 list 中
            for(T ele : array){
                list.add(ele);
            }
        }
        T[] tArr = (T[]) Object[].class.cast(Array.newInstance(list.get(0).getClass(), list.size()));
        return list.toArray(tArr);
    }

    /**
     * 合并 数组(去重--》使用Set集合进行合并)
     * Set 集合 不可重复的特性来实现合并去重
     * @param arr1
     * @param arrays
     * @param 
     * @return
     */
    public static  T[] mergeArraysNoRepeat(T[] arr1, T[]... arrays){
        Set set = new HashSet(Arrays.asList(arr1));
        for(T[] array : arrays){
            for(T ele : array){
                set.add(ele);
            }
        }
        T[] arr = (T[]) Object[].class.cast(Array.newInstance(arr1[0].getClass(), set.size()));
        return set.toArray(arr);
    }

    public static void main(String[] args){
        String[] arr1 = new String[]{"A", "2", "33", "22", "55", "22"};
        String[] arr2 = new String[]{"2", "3", "33", "44", "1111"};
        String[] arr4 = new String[]{"2", "3", "33", "100"};
        String[] arr5 = new String[]{"2", "3", "33", "101"};
//        String[] arr3 = getInterArr(arr1, arr2, arr4, arr5);
//        for(String i : arr3){
//            System.out.println(i);
//        }
        TreeSet set = new TreeSet(Arrays.asList(arr1));
        System.out.println(set.toString());
        Arrays.sort(arr1);
    }
}
需要注意的地方:
Object 和 泛型 是不能直接互相转换的,如果想要转换,需要用反射的方式来转换。如:
T[] o = (T[]) Object[].class.cast(Array.newInstance(数组类型class对象, difSet.size()));  
//Array.newInstance(Class class, int length) 表示知道 class,反射获取其 数组对象。class.cast(Object obj);表示将指定obj类型转换成指定class类型

你可能感兴趣的:(数组工具类:求多个不定类型数组交集,并集,差集,合并去重,合并不去重)