[英]Comparing two Collections in Java
我在 Java 類中有兩個集合。第一個集合包含以前的數據,第二個包含來自以前的集合的更新數據。
我想比較這兩個集合,但我不確定有效實現這一點的最佳方法。兩個集合將包含相同數量的項目。
然后基於每個集合中的 carType 相同,我想執行 carType 方法。
任何幫助表示贊賞
很難幫助,因為你沒有告訴我們你是怎么想比較(大小相等)的集合。 一些想法,希望一個適合:
比較兩個集合,如果它們以相同的順序包含相同的對象
Iterator targetIt = target.iterator();
for (Object obj:source)
if (!obj.equals(targetIt.next()))
// compare result -> false
比較兩個集合,如果它們以任意順序包含相同的對象
for (Object obj:source)
if (target.contains(obj))
// compare result -> false
查找其他集合中已更改的元素
Iterator targetIt = target.iterator();
for (Object obj:source)
if (!obj.equals(targetIt.next())
// Element has changed
根據您的評論,該算法可以做到。 它收集所有已更新的汽車。 如果方法結果是一個空列表,則兩個集合都包含相同順序的相同條目。 該算法依賴於Car
類型上equals()
的正確實現!
public List<Car> findUpdatedCars(Collection<Car> oldCars, Collection<Car> newCars)
List<Car> updatedCars = new ArrayList<Car>();
Iterator oldIt = oldCars.iterator();
for (Car newCar:newCars) {
if (!newCar.equals(oldIt.next()) {
updatedCars.add(newCar);
}
}
return updatedCars;
}
從集合算術來看,集合 A 和 B 是相等的,僅當 A 子集等於 B 和 B 子集等於 A。因此,在 Java 中,給定兩個集合 A 和 B,您可以檢查它們的相等性,而無需考慮元素的順序
boolean collectionsAreEqual = A.containsAll(B) && B.containsAll(A);
Map<Entity, Integer>
,其中Entity
是存儲在您的集合中的類,而Integer
表示它出現的次數。Map
查找它 - 如果它存在,則將Integer
值減一,並在找到匹配項時執行任何必要的操作。 如果Integer
數值已達到零,則從地圖中刪除 (Entity, Integer) 條目。 假設您已經實現了一個高效的hashCode()
方法,該算法將在線性時間內運行。
考慮到空值,稍微更新了一個:
static <T> boolean equals(Collection<T> lhs, Collection<T> rhs) {
boolean equals = false;
if(lhs!=null && rhs!=null) {
equals = lhs.size( ) == rhs.size( ) && lhs.containsAll(rhs) && rhs.containsAll(lhs);
} else if (lhs==null && rhs==null) {
equals = true;
}
return equals;
}
如果不擔心像 (2,2,3), (2,3,3) 這樣的情況:
static <T> boolean equals(Collection<T> lhs, Collection<T> rhs) {
return lhs.size( ) == rhs.size( ) && lhs.containsAll(rhs) && rhs.containsAll(lhs);
}
public static boolean isEqualCollection(java.util.Collection a,
java.util.Collection b)
如果給定的 Collections 包含具有完全相同基數的完全相同的元素,則返回 true。
也就是說,如果 a 中 e 的基數等於 b 中 e 的基數,對於 a 或 b 中的每個元素 e。
參數:
返回: true 如果集合包含具有相同基數的相同元素。
return collection1.toString().equals(collection2.toString());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.