1

我有一个嵌套地图

Map<String, HashMap<String, Integer>> map = new TreeMap<String, HashMap<String, Integer>>();

另外,我有深层地图

HashMap<String, Integer> deep_map = new HashMap<String, Integer>();

我从 txt 文件中读取行并放入嵌套地图,如下所示

try {
    FileInputStream fstream = new FileInputStream("file.txt");
    DataInputStream in = new DataInputStream(fstream);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    String strLine;
    while ((strLine = br.readLine()) != null)  {
        String[] tokens = strLine.split(" ");
        deep_map.put(tokens[1], Integer.parseInt(tokens[2]));
        map.put(tokens[0], deep_map);
    }
    in.close();
} catch (Exception e) {
    System.err.println("Error: " + e.getMessage());
}

txt文件的内容如

John AA 80
Adam BB 60
Natalie BB 65

name是map的key,grade是嵌套map的key,score是嵌套map的value。因此,如何按分数降序对它们进行排序?

4

2 回答 2

1

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());
}
于 2020-01-03T15:40:58.003 回答
0

地图是按键排序的,所以我认为最好的方法是创建一个新的地图,它使用分数作为键,名称列表作为值。

但我不明白你的结构。

于 2020-01-03T15:26:59.947 回答