您需要比较 2 个 csv 文件与 300000 多个文本并找到匹配项,然后将它们显示在屏幕上[重复]

问题描述 投票:0回答:1

我正在从计算机中读取两个 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);}
    }
java arraylist
1个回答
0
投票

我在您发布的代码中发现两个主要问题。

首先,从迭代中删除项目

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));
  }
}

这应该更快。

© www.soinside.com 2019 - 2024. All rights reserved.