web-dev-qa-db-ja.com

ツリーマップを逆の順序で印刷する方法

私の課題では、ファイルから次のテキストが読み取られます。

あるべきか、そうでないか:それが問題です:
苦しむ心の中で気高いかどうか

次に、それぞれが発生した回数を数えます。このマップを並べ替えずに印刷できたので、TreeMapを作成して、自然な順序で印刷することができました(以下を参照)。逆順で印刷する方法がわかりません。コンパレータの使い方は知っていますが、少し錆びているので、できることはやりました。さらに、ツリーマップを逆の順序にソートするようにコンパレータを設定する方法がわかりません。

UnsortedとNaturallysortedを印刷する私の方法は次のとおりです。

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

マップを自然に逆順の新しいマップにコピーするのはどうですか?

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

短い答え:

descendingKeySet または descendingMap を使用します。

長い答え:

解決策1:解決策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:解決策2:

descendingMapCollections.reverseOrder()を使用して、逆の順序で新しいマップを作成することもできます。

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

descendingMapNavigableMapを返すことに注意してください。

7
Navid Vafaei

以下をお試しください

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;
}
1
atul sachan

Stringはすでに比較可能であるため、逆コンパレータは簡単です。

public class RevCmpKey implements Comparator<String> {

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

もう1つの問題は、ジェネリックの値を指定していないことです。 TreeMapを作成するときは、

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

次に、putAllを呼び出すだけで、それで十分です。

1
Luis

ここでは、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を比較します。

1
Devarsh