假设我们有以下文本文件,其中包含ID(非唯一),名称和编号
1 Hello 3
1 Goodbye 2
1 Hello 6
1 Goodbye 5
它们不在同一条线上,我希望能够将它们组合在一起并将其放入变量中。这些不必像这样在彼此旁边,所以如果id和name都相似则需要在if语句中添加数字。
我希望能够将此作为我的输出
Hello 9
Goodbye 7
所以在输出任何内容之前必须读取整个文件,这将如何完成?
答案 0 :(得分:0)
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();
}
答案 1 :(得分:0)
这是一个快速而肮脏的解决方案,它使用Java 8 stream api和Java 7 NIO.2 api:
// 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-将整个文件读入内存,因此如果文件太大,可能会导致问题(大型分配堆,OutOfMemoryError
等)。如果通过流式传输完成会更好。
2-如果允许“名称”具有空格,则用空格分割将失败 - 这将需要一些额外的工作。解决方案假设每行都有3个“列”,由空格分隔。
3-如果允许“名称”具有破折号(-
),则在破坏输出的同时按破折号分割会得到错误的结果。实际上,分组应该使用单独的分类器类,或Tuple
或Entry
。
4-解决方案假设第3列始终是可解析的long
,并且总和不超出Long
的边界。
但至少它可以为您提供以下步骤。您可以通过类似的步骤正确实施。