map
应该包含不同的deep_map
实例,否则每个键都map
将具有相同的 Map 对象,并且您具有覆盖的值。
所以你只需要作为字段:
SortedMap<String, Map<String, Integer>> map = new TreeMap<>();
阅读可以如下。我不使用所有功能,因为这需要很多解释。
Path path = Paths.get("file.txt");
try (Stream<String> lines = Files.lines(path, Charset.defaultCharset()) {
lines.map(line -> line.split(" "))
.filter(tokens -> tokens.length == 3)
.forEach(tokens -> {
Map<String, Integer> deepMap = map.get(tokens[0]);
if (deepMap == null) {
deepMap = new HashMap<String, Integer>();
map.put(tokens[0], deepMap);
}
deepMap.put(tokens[1], Integer.parseInt(tokens[2]));
});
} catch (IOException e) {
System.err.println("Error: " + e.getMessage());
}
但是要按分数降序排列数据:
SortedMap<Integer, Map<String, String>> scoreToCourseToName =
new TreeMap<>(Comparator.reversed());
Path path = Paths.get("file.txt");
try (Stream<String> lines = Files.lines(path, Charset.defaultCharset()) {
lines.map(line -> line.split(" "))
.filter(tokens -> tokens.length == 3)
.forEach(tokens -> {
Integer score = Integer.valueOf(tokens[2]);
Map<String, String> deepMap = scoreToCourseToName.get(score);
if (deepMap == null) {
deepMap = new TreeMap<String, Integer>();
scoreToCourseToName.put(score, deepMap);
}
deepMap.put(tokens[1], Integer.parseInt(tokens[0]));
});
} catch (IOException e) {
System.err.println("Error: " + e.getMessage());
}
并使用更多功能:
SortedMap<Integer, Map<String, String>> scoreToCourseToName =
new TreeMap<>(Comparator.reversed());
Path path = Paths.get("file.txt");
try (Stream<String> lines = Files.lines(path, Charset.defaultCharset()) {
lines.map(line -> line.split(" "))
.filter(tokens -> tokens.length == 3)
.forEach(tokens -> {
Integer score = Integer.valueOf(tokens[2]);
Map<String, String> deepMap =
scoreToCourseToName.computeIfAbsent(score, sc -> new TreeMap<>());
deepMap.put(tokens[1], Integer.parseInt(tokens[0]));
});
} catch (IOException e) {
System.err.println("Error: " + e.getMessage());
}