首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java map的map (嵌套map)排序

Java map的map (嵌套map)排序
EN

Stack Overflow用户
提问于 2020-01-03 23:05:29
回答 2查看 436关注 0票数 1

我有一个嵌套的map作为

代码语言:javascript
复制
Map<String, HashMap<String, Integer>> map = new TreeMap<String, HashMap<String, Integer>>();

此外,我有深度地图作为

代码语言:javascript
复制
HashMap<String, Integer> deep_map = new HashMap<String, Integer>();

我从txt文件中读取代码行,并将其放入嵌套的map中,如下所示

代码语言:javascript
复制
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文件的内容如下

代码语言:javascript
复制
John AA 80
Adam BB 60
Natalie BB 65

名称是地图的关键字,等级是嵌套地图的关键字,分数是嵌套地图的值。因此,我如何按分数降序对它们进行排序?

EN

回答 2

Stack Overflow用户

发布于 2020-01-03 23:40:58

map应该包含不同的deep_map实例,否则map的每个键都将具有相同的Map对象,而您已经覆盖了这些值。

所以你只需要as字段

代码语言:javascript
复制
SortedMap<String, Map<String, Integer>> map = new TreeMap<>();

读数可以如下所示。我没有使用所有的功能,因为这将需要很多解释。

代码语言:javascript
复制
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());
}

然而,将数据按分数降序排序:

代码语言:javascript
复制
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());
}

并且有更多的功能使用:

代码语言:javascript
复制
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());
}
票数 1
EN

Stack Overflow用户

发布于 2020-01-03 23:27:00

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

但我不明白你的结构。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59580872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档