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
}
}
}