在 Java 開發中,經常需要判斷兩個 List 是否包含相同的元素,且不考慮順序。例如 {1,2,3,4} 和 {4,3,2,1} 應該被視為相等。本文介紹一種通用的比較方法,並提供完整代碼示例。
要比較兩個 List 的值是否相等(忽略順序),可以採取以下步驟:
falseimport java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* 比較兩個 List 的值是否相等(忽略順序)
* @param a 第一個 List
* @param b 第二個 List
* @return 相等返回 true,否則返回 false
*/
public static <T extends Comparable<T>> boolean compare(List<T> a, List<T> b) {
// 1. 長度不一致直接返回 false
if (a.size() != b.size()) {
return false;
}
// 2. 分別排序
Collections.sort(a);
Collections.sort(b);
// 3. 逐個比較元素
for (int i = 0; i < a.size(); i++) {
if (!a.get(i).equals(b.get(i))) {
return false;
}
}
return true;
}
// 測試方法
public static void main(String[] args) {
List<Integer> a = Arrays.asList(1, 2, 3, 4);
List<Integer> b = Arrays.asList(4, 3, 2, 1);
System.out.println(compare(a, b)); // 輸出: true
}
T 必須實作 Comparable<T> 介面,才能使用 Collections.sort()compareTo 和 equals 方法若不想改變原 List 順序,或元素不可比較,可考慮使用 Set 或 Map 統計元素出現次數:
// 使用 Map 統計頻次比較(不修改原 List、不要求元素可比較)
public static <T> boolean compareByFrequency(List<T> a, List<T> b) {
if (a.size() != b.size()) return false;
Map<T, Integer> freqA = new HashMap<>();
Map<T, Integer> freqB = new HashMap<>();
a.forEach(e -> freqA.merge(e, 1, Integer::sum));
b.forEach(e -> freqB.merge(e, 1, Integer::sum));
return freqA.equals(freqB);
}
掌握這些比較技巧,能讓你在處理集合去重、資料一致性驗證等場景時更加得心應手。