gpt4 book ai didi

java - 迭代和比较大数据集

转载 作者:行者123 更新时间:2023-12-01 09:20:54 25 4
gpt4 key购买 nike

基本上我从 2 个不同的数据库收到 2 个大数据列表,该列表如下所示:

List 1:
=============
A000001
A000002
A000003
.
.
A999999

List 2:
=============
121111
000111
000003
000001
.
.

我需要比较两个列表,并找出List 1中的每个数据在List 2中可用(在附加一些标准 key 后) ,这样,如果它可用,请将其放入第三个列表中以供进一步操作。例如,A000001 可在 List 1List 2 中使用(在向其附加一些标准 key 后) 所以我需要把它放在第三个列表中。

基本上我有这段代码,对于List 1中的每一行都是这样,我正在迭代List 2中的所有数据并进行比较。 (都是数组列表)

List<String> list1 = //Data of list 1 from db
List<String> list2 = //Data of list 2 from db

for(String list1Item:list1) {
for(String list2Item:list2) {
String list2ItemAfterAppend = "A" + list2Item;
if(list1Item.equalsIgnoreCase(list2ItemAfterAppend)) {
//Add it to 3rd list
}
}
}

是的,这个逻辑工作得很好,但我觉得这不是迭代列表的有效方法。添加计时器后,2000x5000 数据列表平均需要 13444 毫秒。我的问题是,你们还有什么其他逻辑可以想到或建议我来提高这段代码的性能吗?

我希望我说得清楚,如果不清楚,请告诉我是否可以改进问题。

最佳答案

您可以对两个列表进行排序,然后仅使用一个循环对两个值进行迭代,根据哪个值最大来切换哪个索引增量。像这样的东西:

boolean isWorking = true;
Collections.sort(list1);
Collections.sort(list2);
int index1 = 0;
int index2 = 0;

while(isWorking){
String val1 = list1.get(index1);
String val2 = "A" + list2.get(index2);
int compare = val1.compareTo(val2)

if(compare == 0){
list3.add(val1);
index1++;
index2++;
}else if (compare > 0){
val2++;
}else{ // if(compare < 0)
val1++;
}

isWorking = !(index1 == list1.size() || index2 == list2.size() );
}

请小心您使用的列表类型。 LinkedList 上的 get(int i) 开销很大,而它不在 ArrayList 上。另外,您可能想保存 list1.size()list2.size(),我不认为它每次都会计算它,但请检查它。我不确定它是否真的有用/高效,但是您可以使用两个列表中最小的大小来初始化list3(考虑到loadFactor,查找它),因此list3不必每次都调整大小。

上面的代码尚未经过测试(可能会切换 val1++val2++),但您明白了。我相信它比你的更快(因为它是 O(n+m) 而不是 O(n*m) 但我会让你看看( sort()compareTo()<与您的方法相比, 会增加一些时间,但通常不会太多)。如果可以,请使用 RDBMS 在获取两个列表时对它们进行排序(因此您不必在Java代码)

关于java - 迭代和比较大数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40169796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com