在 Java 開發中,處理兩個數組或集合之間的關係運算是常見需求。本文將通過實際代碼示例,詳細講解如何高效實現交集、並集與差集運算。
給定兩個整型數組:
arr1 = [1, 3, 4, 5, 8, 9]
arr2 = [2, 3, 7, 8, 9]
目標:求出它們的交集(共同元素)、並集(所有不重複元素)以及差集(屬於其中一個但不屬於另一個的元素)。
import java.util.ArrayList;
import java.util.Collections;
public class ArraySetOperations {
public static void main(String[] args) {
int[] arr1 = {1, 3, 4, 5, 8, 9};
int[] arr2 = {2, 3, 7, 8, 9};
// 交集運算
ArrayList intersection = getIntersection(arr1, arr2);
printResult("交集", intersection);
// 並集運算
ArrayList union = getUnion(arr1, arr2);
printResult("並集", union);
// 差集運算 (arr1 - arr2)
ArrayList difference = getDifference(arr1, arr2);
printResult("差集 (arr1 - arr2)", difference);
}
/**
* 獲取兩個數組的交集
* 時間複雜度:O(n*m),適用於小數據量
*/
private static ArrayList getIntersection(int[] a1, int[] a2) {
ArrayList result = new ArrayList<>();
for (int i = 0; i < a1.length; i++) {
for (int j = 0; j < a2.length; j++) {
if (a1[i] == a2[j]) {
result.add(a1[i]);
break; // 避免重複添加
}
}
}
return result;
}
/**
* 獲取兩個數組的並集(去重)
*/
private static ArrayList getUnion(int[] a1, int[] a2) {
ArrayList list1 = new ArrayList<>();
ArrayList list2 = new ArrayList<>();
for (int num : a1) list1.add(num);
for (int num : a2) list2.add(num);
// 移除 list1 中也存在於 list2 的元素
list1.removeAll(list2);
// 將剩餘的 list1 元素加入 list2
list2.addAll(list1);
return list2;
}
/**
* 獲取差集 (a1 - a2):屬於 a1 但不屬於 a2 的元素
*/
private static ArrayList getDifference(int[] a1, int[] a2) {
ArrayList list1 = new ArrayList<>();
ArrayList list2 = new ArrayList<>();
for (int num : a1) list1.add(num);
for (int num : a2) list2.add(num);
// 移除 list1 中存在於 list2 的元素
list1.removeAll(list2);
return list1;
}
private static void printResult(String label, ArrayList list) {
Collections.sort(list);
System.out.print(label + ":");
if (list.isEmpty()) {
System.out.println("空集合");
} else {
for (int num : list) {
System.out.print(num + " ");
}
System.out.println();
}
}
}
交集:3 8 9
並集:1 2 3 4 5 7 8 9
差集 (arr1 - arr2):1 4 5
對於大數據量場景,雙重循環的 O(n*m) 複雜度效率較低。推薦使用 HashSet 將時間複雜度優化至 O(n+m):
// 高效交集實現 Setset1 = new HashSet<>(); for (int num : arr1) set1.add(num); Set intersection = new HashSet<>(); for (int num : arr2) { if (set1.contains(num)) intersection.add(num); } // 高效並集實現 Set union = new HashSet<>(set1); for (int num : arr2) union.add(num);