私がしたいのは、値でマップをソートすることです。私は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);
これは非効率的だと思うので、これは悪いアプローチのようです。デフォルトで降順の順序付けを行うために、リンク内のソリューションを変更する方法はありますか。
new TreeMap<>(Collections.reverseOrder());
を使用する必要があります。
_Map<String, Integer> newMap = new TreeMap<>(Collections.reverseOrder());
newMap.putAll(myMap);
_
または、値コンパレータCollections.reverseOrder(comparator)
のような既存のコンパレータを反転します。 compare
/compareTo
を呼び出す前に2つのオブジェクトを交換するアプローチのように機能します。
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()メソッドを使用して、イテレータを反復処理し、値を抽出できます......
これは動作します:
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;
}
});
最初にマイナス記号を追加することで、比較メソッドの戻り値を単純に反転できます。
return -((Integer) map.get(o2)).compareTo((Integer) map.get(o1));
リンク内のソリューションを変更して降順でソートするには、条件を逆にするだけです。
...
// 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
}
...