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

Java 實戰:求兩個數組/集合的交集、並集與差集

     編輯:Java 程式設計入門

問題描述

給定兩個整數數組:

arr1 = [1, 3, 4, 5, 8, 9]
arr2 = [2, 3, 7, 8, 9]

求它們的 交集、並集 與 差集。

核心實現思路

  • 交集:雙重循環遍歷,若元素相等則加入結果集合。
  • 並集:將兩數組元素全部加入列表,利用 removeAll 去重後合併。
  • 差集:可基於並集與交集推導,或直接遍歷比較實現。

完整代碼示例

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 result = intersection(arr1, arr2);
        printResult("交集", result);

        result = union(arr1, arr2);
        printResult("並集", result);

        result = difference(arr1, arr2);
        printResult("差集 (arr1 - arr2)", result);
    }

    // 交集
    private static ArrayList intersection(int[] a1, int[] a2) {
        ArrayList list = new ArrayList<>();
        for (int i = 0; i < a1.length; i++) {
            for (int j = 0; j < a2.length; j++) {
                if (a1[i] == a2[j]) {
                    list.add(a1[i]);
                }
            }
        }
        return list;
    }

    // 並集
    private static ArrayList union(int[] a1, int[] a2) {
        ArrayList list1 = new ArrayList<>();
        ArrayList list2 = new ArrayList<>();
        for (int v : a1) list1.add(v);
        for (int v : a2) list2.add(v);
        list1.removeAll(list2); // 移除 list2 中已有的元素
        list2.addAll(list1);    // 合併剩餘元素
        return list2;
    }

    // 差集 (a1 - a2)
    private static ArrayList difference(int[] a1, int[] a2) {
        ArrayList list1 = new ArrayList<>();
        ArrayList list2 = new ArrayList<>();
        for (int v : a1) list1.add(v);
        for (int v : a2) list2.add(v);
        list1.removeAll(list2); // 保留只在 a1 中的元素
        return list1;
    }

    private static void printResult(String label, ArrayList list) {
        Collections.sort(list);
        System.out.print(label + ":");
        if (list.isEmpty()) {
            System.out.println("null");
        } else {
            for (int v : list) System.out.print(v + " ");
            System.out.println();
        }
    }
}

運行結果

交集:3 8 9
並集:1 2 3 4 5 7 8 9
差集 (arr1 - arr2):1 4 5

進階優化建議

若數據量大,雙重循環 O(n²) 效率較低。可優化為:

  • 將一個數組轉為 HashSet,查找時間降為 O(1),總體 O(n)。
  • 使用 Java 8 Stream API:Arrays.stream(arr1).filter(x -> Arrays.stream(arr2).anyMatch(y -> y == x)).collect(Collectors.toList())。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved