簡體   English   中英

按值從高到低對 Hashmap 進行排序

[英]Sorting Hashmap by values from High to low

我正在嘗試對結構為 hashmap 的值從高到低進行排序。

我在下面創建了一個 function 來對數據進行排序。

public static void SortDataHighToLow (Map <String, Integer> UnsortedMap){
    List <Integer> list = new ArrayList(UnsortedMap.keySet());
    Collections.sort(list,new Comparator <Integer>(){

        @Override
        public int compare(Integer arg0, Integer arg1) {

            return arg0-arg1;
        }
    });

    Map <String, Integer> sortedMap = new LinkedHashMap<>();

    for (Integer keys: list){
        sortedMap.put(UnsortedMap.toString(), keys);
    }

    System.out.println(sortedMap);
}

我收到以下錯誤:

Exception in thread "main" java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap ')

我相信我的錯誤是由上面的 for() 引起的,我無法讀取 Key 值。

我應該做什么調整?

謝謝您的幫助。

這是一個完成這項工作的比較器:

public class MapKeyByValueComparator<K, T> implements Comparator<K> {

    private final Map<K, T> map;

    private final Comparator<T> comparator;

    public MapKeyByValueComparator(Map<K, T> map, Comparator<T> comparator) {
        this.map = map;
        this.comparator = comparator;
    }

    @Override
    public int compare(K o1, K o2) {
        int ritem = comparator.compare(map.get(o1), map.get(o2));
        // CAN NOT RETURNS 0, otherwise key with the same value will be overridden
        if (ritem == 0) {
            ritem = 1;
        }
        return ritem;
    }

}

然后您可以將TreeMap用作:

Map<something, somethig> map = new TreeMap<>(comparator):
map.addAll(...);

但是請注意,這違反了Comparable的合同

強烈建議(雖然不是必需的)自然排序與 equals 一致。 之所以如此,是因為沒有顯式比較器的排序集(和排序映射)在與自然排序與 equals 不一致的元素(或鍵)一起使用時表現得“奇怪”。 特別是,這樣的有序集合(或有序映射)違反了集合(或映射)的一般契約,該契約是根據 equals 方法定義的。

當@deHaar 給出答案后,我的問題就解決了。 代碼如下。

private static <K, V> Map<K, V> sortByValue(Map<K, V> map) {
List<Entry<K, V>> list = new LinkedList<>(map.entrySet());
Collections.sort(list, new Comparator<Object>() {
    @SuppressWarnings("unchecked")
    public int compare(Object o1, Object o2) {
        return ((Comparable<V>) ((Map.Entry<K, V>) (o1)).getValue()).compareTo(((Map.Entry<K, V>) (o2)).getValue());
    }
});

Map<K, V> result = new LinkedHashMap<>();
for (Iterator<Entry<K, V>> it = list.iterator(); it.hasNext();) {
    Map.Entry<K, V> entry = (Map.Entry<K, V>) it.next();
    result.put(entry.getKey(), entry.getValue());
}

return result;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM