我想要做的是按值排序地图。我查看了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);
这似乎是不好的方法,因为我觉得这是低效的。有没有办法在链接中更改解决方案,默认情况下按降序排序。
答案 0 :(得分:113)
您应该使用new TreeMap<>(Collections.reverseOrder());
。
Map<String, Integer> newMap = new TreeMap<>(Collections.reverseOrder());
newMap.putAll(myMap);
或反转现有比较器,如值比较器Collections.reverseOrder(comparator)
。它类似于在调用compare
/ compareTo
之前交换两个对象的方法。
答案 1 :(得分:5)
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()方法提取值......
答案 2 :(得分:3)
这将有效:
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 :(得分:2)
您可以通过在开头添加减号来反转比较方法的返回值:
return -((Integer) map.get(o2)).compareTo((Integer) map.get(o1));
答案 4 :(得分: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
}
...