web-dev-qa-db-ja.com

降順で並べ替え:Java Map

私がしたいのは、値でマップをソートすることです。私は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);

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

33
add-semi-colons

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

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

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

117
Holger
    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()メソッドを使用して、イテレータを反復処理し、値を抽出できます......

6
Nilesh Jadav

これは動作します:

      TreeMap<Integer, Integer> reverseInteger=new TreeMap<>(new Comparator<Integer>() {

        @Override
        public int compare(Integer o1, Integer o2) {
            return o2>o1?1:o2==o1?0:-1;
        }
    });
3
Farman

最初にマイナス記号を追加することで、比較メソッドの戻り値を単純に反転できます。

return -((Integer) map.get(o2)).compareTo((Integer) map.get(o1));
2
OCarneiro

リンク内のソリューションを変更して降順でソートするには、条件を逆にするだけです。

...
// 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
}
...
0
Nicole