38

私がやりたいことは、マップを値でソートすることです。私はstackoverflowサイトで入手可能な多くの質問を調べ、私が望むことを行う次の解決策を見つけましたが、小さなことを見逃していました.

Link1 : ソーティングマップ

しかし、私が直面している問題は、デフォルトではこれが値の昇順でソートされていることです。降順で並べたい:

だから私がしたことは、コンパレータを実装するクラスを作成することでした

class MyComparator implements Comparator {
    Map map;
    public MyComparator(Map map) {
        this.map = map;
    }
    public int compare(Object o1, Object o2) {
        return ((Integer) map.get(o2)).compareTo((Integer) map.get(o1));
    }
}

次に、マップをツリーマップに渡します。

MyComparator comp = new MyComparator(myMap);
Map<String, Integer> newMap = new TreeMap(comp);
newMap.putAll(myMap);

これは非効率的だと思うので、これは悪いアプローチのように思えます。デフォルトで降順で並べ替えるようにリンクのソリューションを変更する方法はありますか。

4

5 に答える 5

130

を使用する必要がありますnew TreeMap<>(Collections.reverseOrder());

Map<String, Integer> newMap = new TreeMap<>(Collections.reverseOrder());
newMap.putAll(myMap);

または value-comparator のような既存のコンパレータを逆にしますCollections.reverseOrder(comparator)compare/を呼び出す前に 2 つのオブジェクトを交換するアプローチのように機能しますcompareTo

于 2013-09-20T18:17:34.893 に答える
7
    TreeMap<Long,String> treeMap = new TreeMap<Long,String>();

    NavigableMap <Long, String> nmap = treeMap.descendingMap();

    Set<Long, String> set = nmap.entrySet();

    Iterator<Long, String> iterator = set.iterator();

iterator.hasNext() および iterator.next() メソッドを使用して、反復子を反復処理し、値を抽出できるようになりました ......

于 2014-10-04T12:16:00.700 に答える
0

リンクのソリューションを降順でソートするように変更するには、条件を逆にします。

...
// Note: this comparator imposes orderings that are inconsistent with equals.    
public int compare(String a, String b) {
    if (base.get(a) >= base.get(b)) {
        return 1; // For ascending, return -1;
    } else {
        return -1; // For ascending, return 1;
    } // returning 0 would merge keys
}
...
于 2013-09-20T18:13:08.490 に答える