首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 中求兩個數組(集合)的交集、並集與差集完整指南

     編輯:Java 綜合教學

Java 數組與集合運算:交集、並集、差集實戰

在 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):

// 高效交集實現
Set set1 = 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);

總結

  • 交集:雙方都包含的元素
  • 並集:雙方所有不重複元素
  • 差集:屬於一方但不屬於另一方的元素
  • 小數據量可用 ArrayList 實現,大數據量建議使用 HashSet 提升性能
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved