[英]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.