首页 > 解决方案 > 通过两次 for 循环迭代处理大量字符串以进行验证

问题描述

我正面临这个问题,有点不知道如何处理它。我需要处理一个可以包含 100 或 10 万行的 csv 文件。

在继续处理之前我需要做一些验证,其中之一是检查每个验证document是否相同typeOfDoc。让我解释:

文件内容:

document;typeOfDoc
25693872076;2
25693872076;2
...
25693872076;1

此验证包括检查文件是否document具有不同类型typeOfDoc,如果是,则表明该文件无效。

最初我想在两个for循环中迭代第一次出现document(我认为这是正确的,因为我不知道我会收到什么),并且为了那个正确document我迭代文件的其余部分以验证是否有另一个出现,如果有相同document但如果 typeOfDoc第一次出现不同,我将此验证存储在一个对象上,以显示该文件有一个document具有两种不同类型的文件。但是......你会想象它的去向。100k 行不会发生这种情况,即使是 100 行也是如此。

哪种方法更好?

可以提供帮助的东西。

这就是我打开和处理文件的方式try-catch,close()和正确的名称被省略了)

List<String> lines = new BufferedReader(new FileReader(path)).lines().skip(1).collect(Collectors.toList());

for (String line : lines) {
    String[] arr = line.split(";");
    String document = arr[0];
    String typeOfDoc = arr[1];
    for (String line2 : lines) {
        String[] arr2 = line2.split(";");
        String document2 = arr2[0];
        String typeOfDoc2 = arr2[1];
        if (document.equals(document2) && !typeOfDoc.equals(typeOfDoc2)) {
            ...create object to show that error on grid...
        }
    }
}

标签: javalistfile

解决方案


您可以尝试在 Hashmap 中查找重复的键和值,这样会更容易。

public class App {

    public static void main(String[] args) throws IOException {
        String delimiter = ";";
        Map<String, String> map = new HashMap<>();

        Stream<String> lines = Files.lines(Paths.get("somefile.txt")); 
        lines.forEach(line -> checkAndPutInMap(line,map,delimiter));
        lines.close();

    }

    private static void checkAndPutInMap(String line, Map<String,String> map, String delimiter) {
        String document = line.split(delimiter)[0];
        String typeOfDoc = line.split(delimiter)[1];
        if (map.containsKey(document) && !map.get(document).equals(typeOfDoc)) {
            ...create object to show that error on grid...
        }
        else
            map.put(document, typeOfDoc));
    }
}

推荐阅读