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

ArrayList 去重方案:利用 contains 檢查構建新列表

     編輯:Java 綜合教學

場景

給定包含重復元素的 ArrayList,需保留首次出現順序並移除後續重復項。假設元素已正確重寫 equals() 和 hashCode()(如自定義 Person 類)。

核心算法:臨時列表 + contains 判重

public static <E> ArrayList<E> distinct(ArrayList<E> source) {
    ArrayList<E> result = new ArrayList<>();
    for (E elem : source) {
        if (!result.contains(elem)) { // 依賴 equals 比較
            result.add(elem);
        }
    }
    return result;
}

完整測試代碼

ArrayList<Person> al = new ArrayList<>();
al.add(new Person("lisi1", 21));
al.add(new Person("lisi2", 22));
al.add(new Person("lisi3", 23));
al.add(new Person("lisi4", 24));
al.add(new Person("lisi2", 22)); // 重復
al.add(new Person("lisi3", 23)); // 重復

System.out.println("去重前:" + al);
al = distinct(al);
System.out.println("去重後:" + al);

// 驗證 remove 也基於 equals
System.out.println(al.remove(new Person("lisi2", 22))); // true
System.out.println("移除後:" + al);

性能與替代方案對比

方案時間複雜度順序保留適用場景
雙層循環/containsO(n²)是小數據量(<1000)
LinkedHashSetO(n)是通用首選,需元素實現 hashCode/equals
Stream.distinct()O(n)是JDK 8+ 函數式風格
排序後相鄰比較O(n log n)否可排序對象,不要求順序

推薦寫法(JDK 8+)

// 一行代碼,高效且保留順序
List<Person> distinct = list.stream().distinct().collect(Collectors.toList());

// 或使用 LinkedHashSet
List<Person> distinct = new ArrayList<>(new LinkedHashSet<>(list));

注意事項

  • contains/remove 依賴 equals(),**務必正確重寫 equals 和 hashCode**,否則無法識別邏輯相等對象。
  • 原列表較大時,new ArrayList<>(new LinkedHashSet<>(list)) 避免了擴容開銷,性能最優。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved