簡體   English   中英

比較 Java 中的兩個集合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM