Java读取文本文件并将不同的行组合在一起
假设我们有一个IDnon-unique、名称和编号的文本文件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的快
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列始终是可解析的长,并且总和不超过长的边界
但至少它可以告诉你应该遵循哪些步骤。您可以使用类似的步骤来正确实现。我想这可以通过编写一些代码来完成。尝试一些代码,如果失败,我们将帮助您。除了基本的文件读取之外,我不知道从哪里开始