Java 按值的降序对地图进行排序

Java 按值的降序对地图进行排序,java,dictionary,collections,Java,Dictionary,Collections,我一直在尝试按值的降序对地图进行排序,但我现有的代码是按键的降序进行排序的。如何按值的降序排序? 我的代码: 您的映射键类型是整数,因此您必须使用Comparator,而compare方法应采用整数输入,通过该整数键,您可以通过map.get(a)和map.get(b)获得双值。在TreeMap构造函数中,您必须定义您创建的comparator类。(即ValueComparator) 请参阅此代码: public static TreeMap<Integer, Double> Sor

我一直在尝试按
值的降序对地图进行排序,但我现有的代码是按
键的降序进行排序的。如何按值的降序排序?
我的代码:


您的映射键类型是整数,因此您必须使用
Comparator
,而
compare
方法应采用整数输入,通过该整数键,您可以通过
map.get(a)
map.get(b)
获得双值。在
TreeMap
构造函数中,您必须定义您创建的comparator类。(即ValueComparator)

请参阅此代码:

public static TreeMap<Integer, Double> SortByValue(Map<Integer, Double> map) {
        ValueComparator vc =  new ValueComparator(map);
        TreeMap<Integer, Double> sortedMap = new TreeMap<Integer, Double>(vc);\\constructor should be vc which extends Comparator
        sortedMap.putAll(map); 
        return sortedMap;
    }

class ValueComparator implements Comparator<Integer> {

    Map<Integer, Double> map;

    public ValueComparator(Map<Integer, Double> base) {
        this.map = base;
    }

    @Override
    public int compare(Integer a, Integer b) {
        // TODO Auto-generated method stub
        if (map.get(a) >= map.get(b)) {
            return -1;
        } else {
            return 1;
        }
    }
}
公共静态树映射SortByValue(映射){
ValueComparator vc=新的ValueComparator(映射);
TreeMap sortedMap=newtreemap(vc);\构造函数应该是扩展比较器的vc
分类地图(地图);
返回分拣的DMAP;
}
类ValueComparator实现Comparator{
地图;
公共价值比较器(地图库){
this.map=base;
}
@凌驾
公共整数比较(整数a、整数b){
//TODO自动生成的方法存根
如果(map.get(a)>=map.get(b)){
返回-1;
}否则{
返回1;
}
}
}

使用不同的数据结构,或者您可以尝试自定义。如果您有密钥并且需要其背后的值,则可以使用映射快速访问(此处为O(logn))。正如@ElliottFrisch所建议的,你最好使用另一个数据结构。看看这个,阅读那里的评论,以及对高投票率答案的评论。这看起来类似于一个相关的问题。虽然它在某些情况下可能会工作,但请注意它有很大的限制,如果违反了这些限制,将导致模糊的bug。
Unsorted Map:{1=0.53, 2=0.48, 23=0.54, 10=0.47}
Sorted Map: {23=0.54, 10=0.47, 2=0.48, 1=0.53}
public static TreeMap<Integer, Double> SortByValue(Map<Integer, Double> map) {
        ValueComparator vc =  new ValueComparator(map);
        TreeMap<Integer, Double> sortedMap = new TreeMap<Integer, Double>(vc);\\constructor should be vc which extends Comparator
        sortedMap.putAll(map); 
        return sortedMap;
    }

class ValueComparator implements Comparator<Integer> {

    Map<Integer, Double> map;

    public ValueComparator(Map<Integer, Double> base) {
        this.map = base;
    }

    @Override
    public int compare(Integer a, Integer b) {
        // TODO Auto-generated method stub
        if (map.get(a) >= map.get(b)) {
            return -1;
        } else {
            return 1;
        }
    }
}