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-comarator Collections.reverseOrder(comparator)compare它的工作方式类似于您在调用/之前交换两个对象的方法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 回答
4

这将起作用:

      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;
        }
    });
于 2017-05-26T17:20:40.557 回答
2

您可以通过在开头添加减号来简单地反转比较方法的返回值:

return -((Integer) map.get(o2)).compareTo((Integer) map.get(o1));
于 2013-09-20T18:32:29.690 回答
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 回答