簡體   English   中英

如何以相反的順序打印樹形圖

[英]How to Print treemap in reverse order

在我的作業中,我們從文件中讀取文本:

成為或不成為:這是一個問題:
是否在心中更高尚受苦

然后計算每次發生的次數。 我已經能夠打印這個未分類的地圖,然后我能夠制作一個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("========================================");

}

這是我的比較器:

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

將地圖復制到一個自然反向排序的新地圖怎么樣?

new TreeMap<String,Integer>(Collections.reverseOrder())

簡答:

使用descendingKeySetdescendingMap

答案很長:

解決方案1:

正如Oliver正確提到的 ,您可以將地圖復制到新的TreeMap中以實現目標。

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

treeMap.descendingKeySet()

這是一個例子:

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

解決方案2:

您還可以使用descendingMap以及Collections.reverseOrder()以相反的順序創建新Map:

NavigableMap<String, Integer> reveresedTreeMap = treeMap.descendingMap();

請注意, descendingMap返回NavigableMap

在這里,您還可以准備ReverseComparator並用於Ordered-Collection中使用的任何類:

class ReverseComparator implements Comparator<Comparable<Object>> {

    @Override
    public int compare(Comparable<Object> o1, Comparable<Object> o2) {

        return o2.compareTo( o1 );
    }

}

通常我們將o1與o2進行比較,但是將o2與o1進行反向比較

試試下面

private TreeMap<BigInteger, List<TicketingDocumentServiceCouponHistory>> getCpnHistoryMap(
        List<TicketingDocumentHistory> tktHistoryList,List<TicketingDocumentServiceCouponTicket> couponList){

    TreeMap<BigInteger, List<TicketingDocumentServiceCouponHistory>> cpnHistoryMap = new TreeMap<>(Collections.reverseOrder());
    cpnHistoryMap.put(BigInteger.valueOf(Integer.MAX_VALUE), getOcCpnHistoryList(couponList));
    tktHistoryList
            .stream()
            .filter(history -> history.getCode().equals(RVL))
            .forEach(history -> cpnHistoryMap.put(history.getSequence(), getCpnHistoryList(cpnHistoryMap, history)));

    TreeMap<BigInteger, List<TicketingDocumentServiceCouponHistory>> cpnHistMapInOrder =  new TreeMap<>();
    cpnHistMapInOrder.putAll(cpnHistoryMap);
    return cpnHistMapInOrder;
}

由於String已經具有可比性,因此反比較器非常簡單:

public class RevCmpKey implements Comparator<String> {

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

另一個問題是你沒有指定泛型的值; 構造TreeMap時,應該使用

TreeMap<String, Integer> revVocabulary = new TreeMap<String, Integer>(new RevCmpKey());

然后你只需要調用putAll即可

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM