排序降序:Java Map

add*_*ons 34 java sorting hashmap

我想要做的是按值排序地图.我找了很多关于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));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我将我的地图传递给树图,

MyComparator comp = new MyComparator(myMap);
Map<String, Integer> newMap = new TreeMap(comp);
newMap.putAll(myMap);
Run Code Online (Sandbox Code Playgroud)

这似乎是不好的方法,因为我觉得这是低效的.有没有办法在链接中更改解决方案,默认情况下按降序排序.

Hol*_*ger 121

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

Map<String, Integer> newMap = new TreeMap<>(Collections.reverseOrder());
newMap.putAll(myMap);
Run Code Online (Sandbox Code Playgroud)

或者像价值比较器那样反转现有的比较器Collections.reverseOrder(comparator).它的工作方式类似于在调用compare/ 之前交换两个对象的方法compareTo.


Nil*_*dav 6

    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();
Run Code Online (Sandbox Code Playgroud)

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


Nic*_*ole 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
}
...
Run Code Online (Sandbox Code Playgroud)