如何以相反的顺序打印树形图
在我的作业中,我们从文件中读取文字:
成为或不成为:这是一个问题:
是否在心中更高尚受苦
然后计算每次发生的次数。 我已经能够打印这个未分类的地图了,然后我就可以制作一个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与o2进行比较,但反向比较o2与o1