1. 程式人生 > 其它 >集合取交集 差集

集合取交集 差集

//1.利用java8特性
public static void main(String[] args) {
List list1 = new ArrayList();
list1.add("1");
list1.add("2");
list1.add("3");
list1.add("5");
list1.add("6");

    List<String> list2 = new ArrayList<String>();
    list2.add("2");
    list2.add("3");
    list2.add("7");
    list2.add("8");

    // 交集  3  2
    List<String> intersection = list1.stream().filter(item -> list2.contains(item)).collect(Collectors.toList());
    System.out.println("---交集 intersection---");
    intersection.parallelStream().forEach(System.out :: println);
   

    // 差集 (list1 - list2)   list1獨有  5  6  1
    List<String> reduce1 = list1.stream().filter(item -> !list2.contains(item)).collect(Collectors.toList());
    System.out.println("---差集 reduce1 (list1 - list2)---");
    reduce1.parallelStream().forEach(System.out :: println);

    // 差集 (list2 - list1) list2獨有  8 7
    List<String> reduce2 = list2.stream().filter(item -> !list1.contains(item)).collect(Collectors.toList());
    System.out.println("---差集 reduce2 (list2 - list1)---");
    reduce2.parallelStream().forEach(System.out :: println);

    // 並集  1 2 3 5 6 2 3 7 8
    List<String> listAll = list1.parallelStream().collect(Collectors.toList());
    List<String> listAll2 = list2.parallelStream().collect(Collectors.toList());
    listAll.addAll(listAll2);
    System.out.println("---並集 listAll---");
    listAll.parallelStream().forEachOrdered(System.out :: println);

    // 去重並集  1 2 3 5 6 7 8
    List<String> listAllDistinct = listAll.stream().distinct().collect(Collectors.toList());
    System.out.println("---得到去重並集 listAllDistinct---");
    listAllDistinct.parallelStream().forEachOrdered(System.out :: println);

    System.out.println("---原來的List1---");
    list1.parallelStream().forEachOrdered(System.out :: println);
    System.out.println("---原來的List2---");
    list2.parallelStream().forEachOrdered(System.out :: println);

}



//2.利用map特性 減少for迴圈  高效找出交集 各自集合獨有的
public static Collection getDiffent(Collection collmax, Collection collmin) {
    //獲取兩個集合的不同元素 並集 csReturn
    //使用LinkeList防止差異過大時,元素拷貝
    Collection csReturn = new LinkedList();
    Collection max = collmax;
    Collection min = collmin;
    //先比較大小,這樣會減少後續map的if判斷次數
    if (collmax.size() < collmin.size()) {
        max = collmin;
        min = collmax;
    }
    //直接指定大小,防止再雜湊
    Map<Object, Integer> map = new HashMap<Object, Integer>(max.size());
    for (Object object : max) {
        map.put(object, 1);
    }
    for (Object object : min) {
        if (map.get(object) == null) {
            //這個步驟可以計算出min集合獨有的
            csReturn.add(object);
        } else {
            //這個步驟可以計算出兩個集合共有的
            map.put(object, 2);
        }
    }
    for (Map.Entry<Object, Integer> entry : map.entrySet()) {
        //這個步驟可以計算出max集合獨有的
        if (entry.getValue() == 1) {
            csReturn.add(entry.getKey());
        }
    }
    return csReturn;
}