我正在尝试对具有类型为 List<String>
的值的HashMap
进行排序。我想按每个List
的size()
排序。
HashMap<String, List<String>> myCalls = new HashMap<String, List<String>>();
我找到了一个我改变的例子来得到这个。
public static <K extends Comparable, V extends Comparable> Map<K, V> sortByValues(Map<K, V> map) {
List<Map.Entry<K, V>> entries = new LinkedList<Map.Entry<K, V>>(map.entrySet());
Collections.sort(entries, new Comparator<Map.Entry<K, V>>() {
@Override
public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
ArrayList myList1 = (ArrayList) o1.getValue();
ArrayList myList2 = (ArrayList) o2.getValue();
if (myList1.size() == myList2.size()) {
return 0;
} else if (myList1.size() < myList2.size()) {
return -1;
} else {
return 1;
}
}
});
Map<K, V> sortedMap = new LinkedHashMap<K, V>();
for (Map.Entry<K, V> entry : entries) {
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
但是当我这样打电话时:
sortByValues(myCalls);
我收到以下错误:
Error:(405, 9) java: method sortByValues in class
com.telstra.chronicler.helpers.JsonFileHelper cannot be applied to
given types; required: java.util.Map<K,V> found:
java.util.HashMap<java.lang.String,java.util.List<java.lang.String>>
reason: inferred type does not conform to declared bound(s)
inferred: java.util.List<java.lang.String>
bound(s): java.lang.Comparable
如何修复此错误?
您收到此错误的原因是您的方法具有泛型绑定V extends Comparable
(使用原始类型,这永远不应该这样做),但List
接口不会扩展Comparable
。您似乎对泛型的工作原理有误解。通常,应使用最不具体的类型边界作为输入,使用最具体的类型边界作为输出。 K
不需要Comparable
.而且,当您想比较不Comparable
的东西时,请使用 Comparator
.这是在 Java 8 中实现的方法的示例:
public static <K, V> Map<K, V> sortByValues(Map<K, V> map, Comparator<? super V> comparator) {
return map.entrySet()
.stream()
// sort entries by applying given comparator to values
.sorted(Comparator.comparing(Map.Entry::getValue, comparator))
// collect into a LinkedHashMap using Collectors.toMap
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> {
// map should never contain duplicate keys
throw new AssertionError();
// Collectors.toMap always adds elements in encounter order; using LinkedHashMap here preserves ordering
}, LinkedHashMap::new));
}
您可以按如下方式调用它:
sortByValues(myCalls, Comparator.comparing(Collection::size));