Ответ 1
Как насчет того, чтобы копировать вашу карту в новую, естественно, упорядоченно?
new TreeMap<String,Integer>(Collections.reverseOrder())
В моем задании мы читаем из файла текст:
Быть или не быть: вот вопрос:
"Благороднее ли в уме страдать".
затем подсчитайте время, которое произошло. Я смог распечатать эту карту несортированной, тогда я смог создать 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;
}
}
Как насчет того, чтобы копировать вашу карту в новую, естественно, упорядоченно?
new TreeMap<String,Integer>(Collections.reverseOrder())
Используйте нисходящий ключ или нисходящую карту.
Как правильно заметил Оливер, вы можете скопировать карту в новый 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));
}
}
Вы также можете создать новую Карту в обратном порядке, используя descendingMap
а также Collections.reverseOrder()
:
NavigableMap<String, Integer> reveresedTreeMap = treeMap.descendingMap();
Обратите внимание, что descendingMap
возвращает NavigableMap
.
Так как 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, и этого достаточно
Здесь вы также можете подготовить 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;
}
Печать значений 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());
}