如何使用降序键对TreeMap进行排序?

时间:2016-04-26 05:15:35

标签: java treemap

因此,我现在正在尝试为学校项目做的事情是使用外部文件创建一个小型高分系统,并使用TreeMap将人员名称映射到他们的分数。然而,仅仅基于我迭代它的方式的性质,数字是碎片化的,我想做它以便它们按降序排列,但我不确定如何。任何帮助,将不胜感激!谢谢!

    File dir = new File(System.getProperty("user.dir") + "/saves");
    try {
        TreeMap<String, Character> scores2 = new TreeMap<>();
        for (File file : dir.listFiles()) {
            InputStream in = new FileInputStream(file);
            String name = file.getName().replace(".dat", "");
            int content;
            while((content = in.read())!=-1) {
                char num = (char)content;
                scores2.put(name, num);
            }
        }
        Text top5 = new Text();
        for (int i = 0; i < dir.list().length; i++) {
            Map.Entry<String, Character> currentEntry = scores2.pollFirstEntry();
            String name = currentEntry.getKey();
            Character score = currentEntry.getValue();
            top5.setText(top5.getText() + name + ": " + score + "\n");
        }
        newPane.setAlignment(Pos.CENTER);
        newPane.add(top5, 1, 1);
        Button exit = new Button("Arrière");
        exit.setOnMouseClicked(mEv -> scene.setRoot(pane));
        newPane.add(exit, 1, 3);
        scene.setRoot(newPane);
    }catch(NullPointerException | IOException e) {
        e.printStackTrace();
        Text txt = new Text("Il n'y a pas de scores pour montrer.");
        Button returnButto = new Button("Retourner?");
        GridPane errPane = new GridPane();
        errPane.add(txt, 1, 1);
        errPane.add(returnButto, 1, 2);
        errPane.setAlignment(Pos.CENTER);
        scene.setRoot(errPane);
        returnButto.setOnMouseClicked(mcEv -> scene.setRoot(pane));
    }

3 个答案:

答案 0 :(得分:3)

正如java docs中提到的,TreeMap:

  

根据其键的自然顺序或在地图创建时提供的比较器进行排序,具体取决于使用的构造函数。

因此,您需要创建自己的Comparator,按降序对元素进行排序,并将其传递给相应的TreeMap构造函数。

答案 1 :(得分:0)

使用descendingKeyIterator函数以反向顺序迭代每个键java.util.Iterator<K> descendingKeyIterator();

因为TreeMap默认自然排序顺序中的存储数据。和函数descendingKeyIterator()将反向迭代。

感谢。

答案 2 :(得分:0)

如果您使用的是Java 8,则可以按照以下步骤进行排序:

    Map<String, Character> scores2 = new TreeMap<>();
    scores2.put("Alice", 'C');
    scores2.put("Bob", 'E');
    scores2.put("Charlie", 'A');
    scores2.put("Dan", 'C');
    scores2.put("Eddie", 'B'); // Just an example
    System.out.println(scores2);

    Map<Character, List<String>> z = scores2.keySet().stream().collect(Collectors.groupingBy(k->scores2.get(k)));
    System.out.println(z);

它将首先打印您的得分2,按名称排序:

{Alice=C, Bob=E, Charlie=A, Dan=C, Eddie=B}

第二张地图,按分数排序:

{A=[Charlie], B=[Eddie], C=[Dan, Alice], E=[Bob]}