其他分享
首页 > 其他分享> > 集合取交集 差集

集合取交集 差集

作者:互联网

//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;
}

标签:交集,list1,System,差集,list2,---,println,集合,out
来源: https://www.cnblogs.com/fightmonster/p/15942511.html