2013-06-20 108 views
3

我有一個枚舉類型爲鍵和雙值作爲值的地圖。我想根據Double值對它進行排序。所以我得到了輸入集,並且想用Collections.sort()和一個比較器。我有以下的代碼比較比較Map.Entry <K,V>

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

我無法解決此問題。任何幫助,高度讚賞。提前致謝。

+0

@CostiCiudatu,沒有不工作。我得到一個「類型ScoreComparator必須實現繼承的抽象方法Comparator > .compare(Map.Entry ,Map.Entry )」錯誤。我實現了上面代碼中所示的方法。 – Raghava

+0

你是對的,我編輯了我的答案,以解決這個問題,並保持比較器的通用性。 –

回答

7

你可能想這樣的:

// 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需要兩個泛型類型參數KVMap.Entry<K, V>不是有效的泛型類型定義,但您可以使用它來綁定到Comparator<T>T類型。

請注意,V必須延伸Comparable<V>,以便能夠撥打compareTo()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()); 
    } 
} 
+0

謝謝你的解釋。那就是訣竅。 – Raghava

+0

@Raghava:查看更新後的答案,可以在沒有聲明'K'的情況下進行替代,這在當前實現中不需要... –

+0

謝謝。這當然是簡潔和更好的。 – Raghava

相關問題