2016-04-26 55 views
0

所以我现在想为一个学校项目做的是使用外部文件制作一个小高分系统,并使用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)); 
    } 
+1

“TreeMap”保持条目按键排序。这里的关键是人的名字(“put”的第一个参数),而不是分数。所以你的树会按名称排序。这看起来不像你想要的。 – ajb

+0

http://stackoverflow.com/questions/18923167/sorting-descending-order-java-map – praveen

+0

[在TreeMap中对键进行自定义数据结构排序]的可能重复(http://stackoverflow.com/questions/7385189/sorting -archust-data-structure-on-key-in-treemap) –

回答

3

java docs提到的,树形图:

根据其键的自然顺序进行排序,或者通过比较在地图创建时提供,这取决于所使用的构造方法。

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

+0

还是不行。 “Comparator”给你一种排序键的方法。上面的代码中的键是“字符串”。所以他可以按降序排序,但这仅仅意味着名为Zywicki的人将位列榜首。 – ajb

+1

@ajb但这只是OP的问题。他在混合键和值。他们应该是相反的方式,因为他使用map * only *来排序。 – Kayaman

0

使用descendingKeyIterator功能通过每个键按相反的顺序进行迭代java.util.Iterator<K> descendingKeyIterator();

,因为在默认情况下自然排序顺序TreeMap存储的数据。和功能descendingKeyIterator()将反向迭代。

谢谢。

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); 

它会首先打印scores2,按名称排序:

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

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

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