需要比较两个容量超过300000的ArrayList

问题描述 投票: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));
                }else {
                    listBD.re   move(listBD.get(i));
                }
            }
        }
        for (String q : result){
            System.out.println(q);}
}

我尝试了各种文件格式,尝试使用 contains

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(listPFM.get(j));
  }
}

这应该更快。

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