java - 按值的降序对 Map 进行排序

标签 java dictionary collections

我一直在尝试按 values 的降序对 map 进行排序但我现有的代码按 keys 降序排序。如何按值的降序排序? 我的代码:

System.out.println("Unsorted Map:" +merger);
Map<Integer, Double> Sortedmerger = SortByValue(merger); 
System.out.println("Sorted Map: "+ Sortedmerger);

public static TreeMap<Integer, Double> SortByValue  (Map<Integer, Double> map) {
ValueComparator vc =  new ValueComparator(map);
TreeMap<Integer, Double> sortedMap = new TreeMap<Integer, Double>(Collections.reverseOrder());
        sortedMap.putAll(map);
        return sortedMap;
    }   

class ValueComparator implements Comparator<Double> {

    Map<Integer, Double> map;

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

    public int compare(Double a, Double b) {
        if (map.get(a) >= map.get(b)) {
            return -1;
        } else {
            return 1;
        } // returning 0 would merge keys 
    }
}

我的输出:

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}

最佳答案

您的 map 键类型是整数,因此您必须使用 Comparator<Integer>和你的compare方法应该采用整数输入,通过该 Integer 键,您可以通过 map.get(a) 获得 Double 值和map.get(b) 。并在 TreeMap您必须定义您创建的比较器类的构造函数。(即 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;
        }
    }
}

关于java - 按值的降序对 Map 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29739000/

相关文章:

java - 反转通用列表中的项目

java - 如何使用 classname.java 而不是 App.java 创建 Java 项目

Java 在 servlet 上下文中存储与数据库查找

arrays - jq from_entries 的变体,它整理每个键出现的值

java - 从集合中选择随机子集的最佳方法?

java - 两个 Set 包含相同的元素,但它们不相等。为什么是这样的结果?

java - Java的Collections.sort如何覆盖待排序的List

java - 支柱 2 : Cannot create a session after the response has been committed

java - 如何在不使用 Play Framework 中的全局对象的情况下在应用程序启动时仅启动一次 Actor?

python - 通过最大值获取dict键