如何以相反的顺序打印树形图

IC2*_*C2D 16 java treemap

在我的作业中,我们从文件中读取文本:

成为或不成为:这就是问题:
在思想中是否更加高尚受苦

然后计算每次发生的次数.我已经能够打印这个未分类的地图,然后我能够制作一个TreeMap并以自然顺序打印它(如下所示).我不知道如何以相反的顺序打印.我知道一种使用比较器的方法,但我有点生疏,所以我尽我所能.此外,我不知道如何设置比较器以将Treemap排序为相反的顺序.

这是我打印未排序和自然排序的方法:

private static void sortPrintFrequencies(Map<String,Integer> vocabulary, PrintStream                                                  output {
Iterator iterator = vocabulary.keySet().iterator();
System.out.println("Unsorted");

while (iterator.hasNext()) {
 String key = iterator.next().toString();
 String value = vocabulary.get(key).toString();
 String times = "times.";
 String appears = "appears";

System.out.printf("%35s", key + "    " + appears + "    " + value + " "+ times);
System.out.println();
    }
System.out.println("========================================");
System.out.println("SORTED NATURALLY BY KEY");
TreeMap newVocabulary = new TreeMap(vocabulary);
Iterator iterator2 = newVocabulary.keySet().iterator();
while (iterator2.hasNext()) {
  String key = iterator2.next().toString();
  String value = newVocabulary.get(key).toString();
  String times = "times.";
  String appears = "appears";

    System.out.printf("%35s", key + "    " + appears + "    " + value + " "+ times);
    System.out.println();
}
  TreeMap revVocabulary = new TreeMap(new RevCmpKey());

  System.out.println("========================================");

}
Run Code Online (Sandbox Code Playgroud)

这是我的比较器:

import java.util.*;
public class RevCmpKey implements Comparator<String> {
public int compare(String e1, String e2) {
    //compareTo in String classs
    if(e1.compareTo(e2) <1)return -1;
    if(e1.compareTo(e2) >1)return 1;
    return 0;
}
}
Run Code Online (Sandbox Code Playgroud)

小智 61

将地图复制到一个自然反向排序的新地图怎么样?

new TreeMap<String,Integer>(Collections.reverseOrder())
Run Code Online (Sandbox Code Playgroud)

  • `descendingMap` 可能更快(请参阅有关此问题的其他答案),因为它不需要复制整个集合。 (3认同)

Nav*_*aei 7

简答:

使用descendingKeySetdescendingMap.

答案很长:

解决方案1:

正如Oliver正确提到的,您可以将地图复制到新的TreeMap中以实现目标.

但是,在使用时descendingKeySet,您不需要创建新的TreeMap:

treeMap.descendingKeySet()
Run Code Online (Sandbox Code Playgroud)

这是一个例子:

private static void printReverseTreeMap(TreeMap<String,Integer> treeMap){
    for(String key : treeMap.descendingKeySet()){
        System.out.println("value of " + key + " is " + treeMap.get(key));
    }
}
Run Code Online (Sandbox Code Playgroud)

解决方案2:

您还可以创建使用相反的顺序一个新的地图descendingMap,以及Collections.reverseOrder():

NavigableMap<String, Integer> reveresedTreeMap = treeMap.descendingMap();
Run Code Online (Sandbox Code Playgroud)

请注意descendingMap返回NavigableMap.

  • `NavigableMap.descendingMap()` 可能比 `Collections.reverseOrder()` 更快,并且可能需要更少的内存,因为降序地图只是底层地图的反向视图。 (2认同)

Lui*_*uis 1

由于 String 已经是可比较的,因此逆比较器很简单:

public class RevCmpKey implements Comparator<String> {

  public int compare(String e1, String e2) {
    return - e1.compareTo(e2);
  }
}
Run Code Online (Sandbox Code Playgroud)

另一个问题是您没有指定泛型的值;当你构建TreeMap时,你应该使用

TreeMap<String, Integer> revVocabulary = new TreeMap<String, Integer>(new RevCmpKey());
Run Code Online (Sandbox Code Playgroud)

然后你只需调用 putAll 就足够了