2013-06-20 5 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 должен реализовать унаследованный абстрактный метод. Компаратор > .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 принимает два аргумента шаблонного типа K и V. Map.Entry<K, V> не является допустимым типичным определением типа, но вы можете использовать его для привязки к .

Обратите внимание, что 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

Смежные вопросы