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

Java 檢查陣列重複元素:HashSet 去重法與 Stream API 現代寫法

     編輯:Java 相關知識

核心邏輯:Set 特性天然去重

Set 不允許重複元素,若陣列長度與 Set.size() 不等,則存在重複。

傳統寫法(Java 7+)

public static boolean hasNoDuplicates(String[] array) {
    if (array == null) return true;  // 或拋異常視業務而定
    Set set = new HashSet<>(Arrays.asList(array));
    return set.size() == array.length;
}

// 呼叫範例
String[] arr = {"a", "b", "c", "a"};
System.out.println(hasNoDuplicates(arr));  // false(有重複)

Java 8+ Stream 寫法(更函數式)

public static boolean hasNoDuplicates(String[] array) {
    return array != null && Arrays.stream(array).distinct().count() == array.length;
}

// 或直接收集到 Set
public static boolean hasNoDuplicates(String[] array) {
    return array != null && new HashSet<>(Arrays.asList(array)).size() == array.length;
}

進階:找出具體重複元素

public static Set findDuplicates(String[] array) {
    Set seen = new HashSet<>();
    Set duplicates = new HashSet<>();
    for (String s : array) {
        if (!seen.add(s)) {  // add 回傳 false 表示已存在
            duplicates.add(s);
        }
    }
    return duplicates;
}

// Stream 版
public static Set findDuplicates(String[] array) {
    return Arrays.stream(array)
                 .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
                 .entrySet().stream()
                 .filter(e -> e.getValue() > 1)
                 .map(Map.Entry::getKey)
                 .collect(Collectors.toSet());
}

效能與記憶體分析

方法時間複雜度空間複雜度備註
HashSet 去重O(N)O(N)最通用、效能最佳
排序後相鄰比較O(N log N)O(1) 或 O(N)不想用額外空間時可考慮
雙重迴圈O(N²)O(1)僅適合極小陣列 (N<50)

基本型別陣列優化

若為 int[]、long[] 等基本型別,避免裝箱開銷:

// 使用 primitive 集合庫(如 Eclipse Collections、FastUtil)或排序法
public static boolean hasDuplicateInt(int[] arr) {
    Arrays.sort(arr);
    for (int i = 1; i < arr.length; i++) {
        if (arr[i] == arr[i-1]) return true;
    }
    return false;
}

總結

  • 物件陣列:new HashSet<>(Arrays.asList(arr)).size() == arr.length 一行搞定
  • 需定位重複值:用 seen.add() 回傳值或 Stream groupingBy
  • 基本型別大陣列:排序法避免裝箱,或引入 primitive 集合庫
  • Null 安全:根據業務決定 null 算不算重複,統一規範
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved