排序降序:Java Map

Sorting Descending order: Java Map

我要做的是按值对地图进行排序。我研究了StackOverflow站点上提供的许多问题,发现下面的解决方案可以满足我的需要,但是缺少了一个小问题。

链接1:排序图

但我遇到的问题是,默认情况下,这是按值升序排序的。我想按降序排序:

所以我所做的是创建一个实现比较器的类

1
2
3
4
5
6
7
8
9
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));
    }
}

然后我把地图传给Treemap,

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

这似乎是一个糟糕的方法,因为我觉得这是低效的。是否有方法更改链接中的解决方案,默认情况下按降序排序。


你应该使用new TreeMap<>(Collections.reverseOrder());

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

或者反转现有的比较器,如值比较器Collections.reverseOrder(comparator)。它的工作方式类似于在调用comparecompareTo之前交换两个对象的方法。


1
2
3
4
5
6
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();

现在,您可以迭代迭代器并使用迭代器.hasNext()和迭代器.next()方法提取值……


这将起作用:

1
2
3
4
5
6
7
      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;
        }
    });

您可以通过在开始处添加一个减号来简单地反转compare方法的返回值:

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


要将链接中的解决方案更改为按降序排序,只需反转条件:

1
2
3
4
5
6
7
8
9
10
...
// 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
}
...