gpt4 book ai didi

java - 比较大型列表并提取缺失数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:23:52 31 4
gpt4 key购买 nike

我有两个非常大的ArrayList,每个都包含数百万条数据。我想从 List1 中过滤掉 List2 中不存在的数据,反之亦然。

我尝试过 Apache CollectionUtils,Java 8 流 API,但没有成功。

Java 8 并行流正在消耗所有 CPU,CollectionUtils 继续比较数据集而没有任何输出。

POJO 示例

public DataVO {
private String id;
private String value;
...
// getters / setters

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = (prime * result) + ((id == null) ? 0 : id.hashCode());
return result;
}

@Override
public boolean equals(final Object obj) {
...
...
final DataVO other = (DataVO) obj;
if (id == null) {
if (other.id != null) {
return false;
}
}
else if (!id.equals(other.id)) {
return false;
}
return true;
}
}

hashCode()/equals() 可以有更多字段,现在我保持简单。

我还尝试将 List1 分成更小的 block ,然后尝试与 List2 进行比较,但没有任何结果。我看过其他问题,但没有一个考虑过非常大的数量。

如果您有任何指点,请告诉我。

最佳答案

您可以将 ArrayList 的大块读取到 HashSet 中,比如 10k 个元素。确保在 HashSet 构造函数上设置大小。然后对于每个 block 调用 HashSet#RemoveAll 和另一个 ArrayList。其余条目就是您的答案。甚至可能与 ThreadPoolExecutor 并行化。

List missing = new ArrayList(); // answer

for (int i = 0; i < list1.size(); ) {
int offset = i;
i += 16 * 1024;
if (i > list1.size()) i = list1.size();
Set chunk = new HashSet(list1.subList(offset, i));

for (int j = list2.size(); --j >= 0; chunk.remove(list2.get(j));
missing.addAll(chunk);
}

关于java - 比较大型列表并提取缺失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52558577/

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