簡體   English   中英

Java 有效比較兩個列表

[英]Java compare two lists efficiently

我需要比較來自兩個不同來源的兩個列表的結果。

List<MyData> baseList = new ArrayList<>();

在此處輸入圖像描述

List<MyData> externalList = new ArrayList<>();

在此處輸入圖像描述

我需要比較兩個列表 w.r.t 和 UserACCNUM 上的 CFCHash 記錄,如果 CDCHash 有任何變化,我需要更新 baseList 中的特定記錄。

我嘗試了下面的循環,這聽起來效率不高

for(MyData ext : externalList) {
  for(MyaData base : baseList) {
      if(ext.getCDCHash().equals(base.getCDCHash()) && ext.getAccNum().equals(base.getAccNum()) {
       // no change
     }
     else { 
       // changes found - need to update
     }
  }
}

list.stream() 在這種情況下是否有效? 我有將近 10 萬條記錄要比較。

我如何有效地實現這一目標?

您可以通過為兩個列表之一創建快速查找Map來將二次算法轉換為線性算法,然后循環另一個列表,同時使用查找按帳號在另一個列表中查找相應的記錄。

JS 示例只是因為我們不能在這里運行 Java;)請注意,為了示例,我們假設兩個列表的長度相同。

 const listA = [{ hash: 'account1v1', account: 1 }, { hash: 'account2v1', account: 2 }]; const listB = [{ hash: 'account1v1', account: 1 }, { hash: 'account2v2', account: 2 }]; const dirtyRecords = findDirtyRecords(listA, listB); console.log(dirtyRecords); function findDirtyRecords(listA, listB) { const listAMap = new Map(); for (const record of listA) listAMap.set(record.account, record); return listB.filter(r => r.hash.== listAMap.get(r.account);hash); }

如果MyData實現:

  • Comparable
  • equalshashCode

...並且您願意使用Google Guava

如果您將擁有的兩個列表設置為Set s(如果您真的希望它們是……,則可以對它們進行排序),那么您所要做的就是調用Sets.difference(baseList, externalList) 然后,您可以遍歷生成的記錄集合以更新baseList中需要的值。

不要一口氣做這件事。 將此作為兩個單獨的操作來執行會更好也更簡潔,這樣可以更輕松地調試和確定正在發生的事情。

那么首先,您的問題可能無法解決您的問題。

正如我根據您提供的表格所見,您的 hash確實發生了變化,並且值可能會發生變化 我看到唯一標識符很可能是user acc num

根據您的數據源,對兩個源進行迭代/分頁(如果它們按某些參數排序,例如 acct num )並僅比較數據子集可能是有意義的。

比方說,查詢帳戶 1-20(或 1-1000),獲取最小/最大帳戶編號,然后在第二個數據源上運行相同的查詢以獲取相同的帳戶

然后對 collections 進行排序和迭代(嘗試匹配 ID)並比較每一行的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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