繁体   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