java - 想要比较两个记录列表,将公共保存到一个新列表,记录在 1M 左右,需要大量时间来处理
问题描述
我正在处理 2 个 csv 文件并检查常见条目并将它们保存到一个新的 csv 文件中。但是比较需要很多时间。我的方法是首先将文件中的所有数据读入 ArrayList,然后在主列表上使用 parallelStream,我在另一个列表上进行比较,并使用字符串生成器附加常见条目,然后将其保存到新的 csv 文件中。下面是我的代码。
allReconFileLines.parallelStream().forEach(baseLine -> {
String[] baseLineSplitted = baseLine.split(",|,,");
if (baseLineSplitted != null && baseLineSplitted.length >= 13 && baseLineSplitted[13].trim().equalsIgnoreCase("#N/A")) {
for (int i = 0; i < allCompleteFileLines.size(); i++) {
String complteFileLine = allCompleteFileLines.get(i);
String[] reconLineSplitted = complteFileLine.split(",|,,");
if (reconLineSplitted != null && reconLineSplitted[3].replaceAll("^\"|\"$", "").trim().equals(baseLineSplitted[3].replaceAll("^\"|\"$", "").trim())) {
//pw.write(complteFileLine);
matchedLines.append(complteFileLine);
break;
}
}
}
});
pw.write(matchedLines.toString());
目前处理需要数小时。我怎样才能让它快点?
解决方案
将一个文件的键读入例如 a HashSet
,然后在读取第二个文件时,为每一行检查它是否在集合中,如果是则将其写出。这样你只需要足够的内存来保存一个文件的密钥。
推荐阅读
- vue.js - 对象数组模型绑定中的复选框组件
- powershell - Powershell - 用分组项目替换.csv中的行
- python - 如何使用嵌套的 for 循环防止重复条目?
- google-apps-script - 在 Google Apps 脚本中,如何返回格式为日期的单元格的文本值?
- django - 如何将 csrftoken 从 Django Rest Framework 后端发送到 React Native 前端?
- typescript - 无法识别扩展的快速请求对象
- c++ - 如何防止 CGAL 在 3D Alpha Shape 中生成简并四面体?
- powershell - Powershell - 使用参数运行 .MSI 安装,但弹出 Windows Installer 并且没有任何反应
- sql - Postgresql 添加空数组检查
- javascript - 如何将图像向右移动?