Подтвердить что ты не робот

Как распечатать treemap в обратном порядке

В моем задании мы читаем из файла текст:

Быть или не быть: вот вопрос:
  "Благороднее ли в уме страдать".

затем подсчитайте время, которое произошло. Я смог распечатать эту карту несортированной, тогда я смог создать TreeMap и напечатать ее в натуральном порядке (что показано ниже). Я не знаю, как печатать в обратном порядке. Я знаю способ использования компаратора, но я немного ржавый, поэтому я сделал все, что мог. Кроме того, я не знаю, как установить компаратор для сортировки Treemap в обратном порядке.

Здесь мой метод для печати Unsorted и Naturally отсортирован:

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

Ответ 1

Как насчет того, чтобы копировать вашу карту в новую, естественно, упорядоченно?

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

Ответ 2

Короткий ответ:

Используйте нисходящий ключ или нисходящую карту.

Длинный ответ:

Решение 1:

Как правильно заметил Оливер, вы можете скопировать карту в новый 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():

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

Обратите внимание, что descendingMap возвращает NavigableMap.

Ответ 3

Так как String уже сравнима, обратный компаратор тривиален:

public class RevCmpKey implements Comparator<String> {

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

Другая проблема заключается в том, что вы не указываете значения для Generics; Когда вы создаете TreeMap, вы должны использовать

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

Затем вы просто вызываете putAll, и этого достаточно

Ответ 4

Здесь вы также можете подготовить 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

Ответ 5

Просто попробуйте ниже

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

Ответ 6

Печать значений TreeMap в обратном порядке ключей:

Мы также можем использовать стеки для этого!

TreeMap<Integer, Integer> tm = new TreeMap<>();

tm.put(key1, value1);
tm.put(key2, value2);
tm.put(key3, value3);
tm.put(key4, value4);
tm.put(key5, value5);
tm.put(key6, value6);
Stack<Integer> st = new Stack<Integer>(); 

for(Integer entry : tm.keySet()){
    st.push(entry); 
}

Iterator it = st.iterator(); 

while(it.hasNext()){
    System.out.println(st.pop()); 
}