如何修复将字符串的哈希图排序为键,列表作为对象的错误



我正在尝试对具有类型为 List<String> 的值的HashMap进行排序。我想按每个Listsize()排序。

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));

最新更新