Map.Entry <K,V>的比较器

Rag*_*ava 3 java map comparator

我有一个地图,其中枚举类型为键,Double为值.我想根据Double值对此进行排序.所以我得到了入门集,想要使用Collections.sort()比较器.我有比较器的以下代码

class ScoreComparator<Map.Entry<K, V>> implements Comparator<Map.Entry<K, V>> {
    public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
        return o1.getValue().compareTo(o2.getValue());
    }   
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息

  1. Syntax error on token ".", extends expected (line 1).
  2. The type parameter Map is hiding the type Map<K,V> (line 1).
  3. 由于上述两个错误,K和V无法解析为类型(第3,4行).

我无法解决这个问题.任何帮助都非常感谢.提前致谢.

Luk*_*der 10

你可能想要这个:

// Declare K and V as generic type parameters to ScoreComparator
class ScoreComparator<K, V extends Comparable<V>> 

// Let your class implement Comparator<T>, binding Map.Entry<K, V> to T
implements Comparator<Map.Entry<K, V>> {
    public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {

        // Call compareTo() on V, which is known to be a Comparable<V>
        return o1.getValue().compareTo(o2.getValue());
    }   
}
Run Code Online (Sandbox Code Playgroud)

ScoreComparator采用两个泛型类型参数KV.Map.Entry<K, V>是不是有效的泛型类型定义,但你很可能用它来绑定到Comparator<T>T类型.

需要注意的是V必须扩展Comparable<V>,为了能够调用compareTo()o1.getValue().

您现在可以使用上述内容 ScoreComparator:

new ScoreComparator<String, String>();
new ScoreComparator<Long, Integer>();
// etc...
Run Code Online (Sandbox Code Playgroud)

请注意,从您当前的实现中,您可能甚至不需要 K参数.替代:

class ScoreComparator<V extends Comparable<V>> 
implements Comparator<Map.Entry<?, V>> {
    public int compare(Map.Entry<?, V> o1, Map.Entry<?, V> o2) {

        // Call compareTo() on V, which is known to be a Comparable<V>
        return o1.getValue().compareTo(o2.getValue());
    }   
}
Run Code Online (Sandbox Code Playgroud)