Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java可以有效地比较两个列表_Java_Arraylist - Fatal编程技术网

Java可以有效地比较两个列表

Java可以有效地比较两个列表,java,arraylist,Java,Arraylist,我需要比较来自两个不同来源的两个列表的结果 List<MyData> baseList = new ArrayList<>(); 在这种情况下,list.stream()有效吗?我有将近10万条记录要比较 如何有效地实现这一点?您可以通过为两个列表中的一个创建快速查找Map,然后循环另一个列表,同时使用查找按帐号查找另一个列表中的相应记录,将二次算法转换为线性算法 JS示例只是因为我们不能在这里运行Java;) 注意,出于示例的考虑,我们假设两个列表的长度相同 con

我需要比较来自两个不同来源的两个列表的结果

List<MyData> baseList = new ArrayList<>();
在这种情况下,list.stream()有效吗?我有将近10万条记录要比较


如何有效地实现这一点?

您可以通过为两个列表中的一个创建快速查找
Map
,然后循环另一个列表,同时使用查找按帐号查找另一个列表中的相应记录,将二次算法转换为线性算法

JS示例只是因为我们不能在这里运行Java;) 注意,出于示例的考虑,我们假设两个列表的长度相同

constlista=[{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);
函数findDirtyRecords(listA,listB){
const listAMap=新映射();
对于(listA的常量记录)listAMap.set(record.account,record);
返回listB.filter(r=>r.hash!==listAMap.get(r.account.hash);

}
首先,你的问题可能解决不了你的问题

正如我看到的,根据您提供的表,您的哈希确实会发生变化,并且值可能会发生变化。我发现唯一标识符很可能是
user acc num

根据数据源的不同,对两个数据源进行迭代/分页(如果它们是按某个参数排序的,例如acct num)并仅比较数据子集可能是有意义的

比方说,查询帐户1-20(或1-1000),获取最小/最大帐户数&然后对第二个数据源运行相同的查询以获取相同的帐户


然后对两个集合进行迭代(尝试匹配ID)并比较每一行上的值。

如果
MyData
实现以下功能,那么一点集合论可能会有所帮助:

  • 可比性
  • 等于
    hashCode
…你可以使用

如果您将您拥有的两个列表设置为
set
s(如果您确实希望它们是…,则可以对它们进行排序),那么您所要做的就是调用
set.difference(baseList,externalList)
。然后,您可以迭代生成的记录集合,以更新需要在
基本列表中更新的值

不要担心一下子就能做到这一点。作为两个单独的操作,这样做更好、更简洁,以便更容易调试和确定正在进行的操作。

如果需要运行Java,您可以联机使用
List<MyData> externalList = new ArrayList<>();
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
     }
  }
}