我正在从计算机中读取两个 CSV 文件,并用这些数据填充数组列表。 然后我比较这两个数组列表以查找匹配项。
如果 CSV 文件最多包含 20 行,那么查找匹配项和显示没有问题,但当 CSV 文件包含超过 300,000 行时,结果很繁琐。
RFM.csv 文件包含 15000+ 行并显示完整的内容列表,CSV 文件包含 300000+ 行并在 299000+ 行后输出。但如果单独输出索引,则输出 0 到 299000 之间的值没有问题。
CSV 文件中的行未排序。这两个文件包含全名和出生日期。
请告诉我错误是什么?
public class Podft {
public static void main(String[] args) throws IOException{
ArrayList<String> listBD = new ArrayList<>();
ArrayList<String> listPFM = new ArrayList<>();
ArrayList<String> result = new ArrayList<>();
BufferedReader readerBD = new BufferedReader(new FileReader("C:\\Users\\d\\Doc\\БД.csv"));
BufferedReader readerPFM = new BufferedReader(new FileReader("C:\\Users\\d\\Doc\\РФМ.csv"));
String lineBD = readerBD.readLine();
String linePFM = readerPFM.readLine();
while (lineBD != null) {
listBD.add(lineBD);
lineBD = readerBD.readLine();
}
while (linePFM != null) {
listPFM.add(linePFM);
linePFM = readerPFM.readLine();
}
for(int i = 0; i < listBD.size(); i++){
for(int j = 0; j < listPFM.size(); j++){
if(listBD.get(i).equals(listPFM.get(j))){
result.add(listPFM.get(j));
}
}
}
for (String q : result){
System.out.println(q);}
}
我在您发布的代码中发现两个主要问题。
首先,从迭代中删除项目
List
可能会导致潜在的数据跳过。在这种情况下,问题是:既然 listBD
没有返回或打印,为什么你必须删除项目?
其次,性能问题:对于第一个列表中的每个元素,您要扫描第二个列表中的每个元素,从而获得
NxM
计算成本。我可以建议,对于listPFM
,使用一个HashSet
或至少一个LinkedHashSet
(如果您需要保留listPFM
记录的顺序,以进行进一步分析)并使用contains
方法,即基于哈希码。像这样的东西:
for(int i = 0; i < listBD.size(); i++) {
if(listPFM.contains(listBD.get(i))) {
result.add(listBD.get(i));
}
}
这应该更快。