5

我有一个以枚举类型为键、以 Double 作为值的 Map。我想根据 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());
    }   
}

我收到以下错误消息

  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 行)。

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

4

1 回答 1

12

你可能想要这个:

// 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());
    }   
}

ScoreComparator接受两个泛型类型参数KV. Map.Entry<K, V>不是有效的泛型类型定义,但您可以使用它来绑定到Comparator<T>T类型。

注意V一定要extend Comparable<V>,才能调用compareTo()on o1.getValue()

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

new ScoreComparator<String, String>();
new ScoreComparator<Long, Integer>();
// etc...

请注意,从您当前的实现中,您可能甚至不需要该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());
    }   
}
于 2013-06-20T10:40:17.590 回答