集合取交集 差集
阿新 • • 發佈:2022-03-05
//1.利用java8特性
public static void main(String[] args) {
List
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; }