下午好。 我正在从计算机中读取两个 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));
}else {
listBD.re move(listBD.get(i));
}
}
}
for (String q : result){
System.out.println(q);}
}
我尝试了各种文件格式,尝试使用 contains
我在您发布的代码中看到两个主要问题。
首先,从迭代中删除项目
List
可能会导致潜在的数据跳过。在这种情况下,问题是:既然 listBD
没有返回或打印,为什么你必须删除项目?
其次,性能问题:对于第一个列表中的每个元素,您要扫描第二个列表中的每个元素,从而获得
NxM
计算成本。我可以建议,对于listPFM
,使用一个HashSet
或至少一个LinkedHashSet
(如果您需要保留listPFM
记录的顺序,以进行进一步分析)并使用contains
方法,即基于哈希码。像这样的东西:
for(int i = 0; i < listBD.size(); i++) {
if(listPFM.contains(listBD.get(i))) {
result.add(listPFM.get(j));
}
}
这应该更快。