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

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

成为或不成为:这是一个问题:
是否在心中更高尚受苦

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

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

private static void sortPrintFrequencies(Map 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("========================================"); } 

这是我的比较器:

 import java.util.*; public class RevCmpKey implements Comparator { public int compare(String e1, String e2) { //compareTo in String classs if(e1.compareTo(e2) 1)return 1; return 0; } } 

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

 new TreeMap(Collections.reverseOrder()) 

简答:

使用descendingKeySet或descendingMap 。

答案很长:

解决方案1:

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

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

 treeMap.descendingKeySet() 

这是一个例子:

 private static void printReverseTreeMap(TreeMap treeMap){ for(String key : treeMap.descendingKeySet()){ System.out.println("value of " + key + " is " + treeMap.get(key)); } } 

解决方案2:

您还可以使用descendingMap以及Collections.reverseOrder()以相反的顺序创建新Map:

 NavigableMap reveresedTreeMap = treeMap.descendingMap(); 

请注意, descendingMap返回NavigableMap

由于String已经具有可比性,因此逆比较器非常简单:

 public class RevCmpKey implements Comparator { public int compare(String e1, String e2) { return - e1.compareTo(e2); } } 

另一个问题是你没有指定generics的值; 构造TreeMap时,应该使用

 TreeMap revVocabulary = new TreeMap(new RevCmpKey()); 

然后你只需要调用putAll即可

在这里,您还可以准备ReverseComparator并用于Ordered-Collection中使用的任何类:

 class ReverseComparator implements Comparator> { @Override public int compare(Comparable o1, Comparable o2) { return o2.compareTo( o1 ); } } 

通常我们将o1与o2进行比较,但反向比较o2与o1