Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java读取文本文件并将不同的行组合在一起_Java - Fatal编程技术网

Java读取文本文件并将不同的行组合在一起

Java读取文本文件并将不同的行组合在一起,java,Java,假设我们有一个IDnon-unique、名称和编号的文本文件 1 Hello 3 1 Goodbye 2 1 Hello 6 1 Goodbye 5 它们不在同一行上,我希望能够将它们相加,并将其放入变量中。它们不必像这样紧挨在一起,所以需要在if语句中,如果id和name都相似,则添加数字 我希望能够得到这个作为我的输出 Hello 9 Goodbye 7 因此,在输出任何内容之前,它必须读取整个文件,这将如何完成?下面是一个使用Java 8流api和Java 7 NIO.2 api的快

假设我们有一个IDnon-unique、名称和编号的文本文件

1 Hello 3
1 Goodbye 2
1 Hello 6
1 Goodbye 5
它们不在同一行上,我希望能够将它们相加,并将其放入变量中。它们不必像这样紧挨在一起,所以需要在if语句中,如果id和name都相似,则添加数字

我希望能够得到这个作为我的输出

Hello 9
Goodbye 7 

因此,在输出任何内容之前,它必须读取整个文件,这将如何完成?

下面是一个使用Java 8流api和Java 7 NIO.2 api的快速而肮脏的解决方案:

    File file = new File("your/file/path");
    String line = "";
    try (BufferedReader reader = new BufferedReader(new FileReader(file))) {

        while ((line = reader.readLine()) != null) {
            // the algorithm that YOU should develop
            //or fail to develop and ask about to group things etc.
        }

    } catch (IOException ex) {
        ex.printStackTrace();
    }
// read all lines from the file
Files.readAllLines(Paths.get("<path_to_your_file>"))
        // begin the stream
        .stream()
        // split every line by whitespaces
        // to get arrays like [1, "Hello", 3], [1, "Goodbye", 2]...
        .map(s -> s.split("\\s+"))
        // collecting to a map, grouping by the String {firstColumn}-{secondColumn}
        .collect(Collectors.groupingBy(split -> split[0] + "-" + split[1],
                // downstream collector sums the 3rd column after parsing them as long
                Collectors.summingLong(split -> Long.parseLong(split[2]))))
        // so we have Map<String, Long> with entries like {1-Hello -> 9}, {2-Goodbye -> 7}
        .forEach((key, value) ->
                // we print these entries one each line (println)
                // by taking the part after dash of key,
                // and a space between key and value, like: Hello 9
                System.out.println(key.split("-")[1] + " " + value));
请注意,此解决方案远未完成,例如: 1-将整个文件读取到内存中,因此如果文件太大,可能会导致问题—分配的堆太大、OutOfMemoryErrors等。如果通过流式处理,效果会更好

2-如果允许名称包含空格,则使用空格拆分将失败-这将需要一些额外的工作。该解决方案假设每行正好有3列,由空格分隔

3-如果允许名称包含破折号-,则在撬动输出时按破折号拆分将给出不正确的结果。事实上,分组应该使用一个单独的分类器类,或者使用一个元组或条目

4-解决方案假设第3列始终是可解析的长,并且总和不超过长的边界


但至少它可以告诉你应该遵循哪些步骤。您可以使用类似的步骤来正确实现。

我想这可以通过编写一些代码来完成。尝试一些代码,如果失败,我们将帮助您。除了基本的文件读取之外,我不知道从哪里开始