2013-12-04 2 views
0

Компаратора является интерфейсом, и я считаю, что это не может быть реализован, но смотрите фрагмент код нижеКомпаратор интерфейса в Java

Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() 
       { 
          //Compare method 
         }); 

Здесь интерфейс компаратора был создан экземпляром, это правильный путь к коде , Кто-то, пожалуйста, помогите. Спасибо

+0

http://stackoverflow.com/questions/16750772/instantiating-interfaces-in-java –

+0

Вы не создаете экземпляр интерфейса, а анонимный внутренний класс, реализующий интерфейс Comparator. – Ron

+0

Thanks Ron, Я читал (а) понятие анонимного класса, а теперь его ясно – Lij

ответ

3

Этот один из правильных способов реализации интерфейса и этой реализации называется anonymous class.

Обратите внимание, что вы реализуете экземпляр Comparator, который нельзя назвать переменной.

Еще одно замечание: Вы должны обеспечить реализацию метода

public int compareTo(Map.Entry<String, Integer> entry1, 
        Map.Entry<String, Integer> entry2) { .. } 

, в противном случае он не будет компилироваться.

+0

Thank You Kocko – Lij

+1

+1. @Lij Пожалуйста, отметьте это как ответ, если вы сочтете это полезным. –

0

Анонимный экземпляр Comparator должен удовлетворять интерфейсу, реализуя метод compare. Comparator - это интерфейс SAM (Single Abstract Method), который позволяет создавать его через анонимный класс.

Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() 
{ 
    public int compare(Map.Entry<String,Integer> entry1, Map.Entry<String,Integer> entry2) { 

    } 
}); 
0
Comparator<Map.Entry<String, Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() { 

     @Override 
     public int compare(Entry<String, Integer> arg0, Entry<String, Integer> arg1) { 
      // logic here 
      return 0; 
     } 

    }; 

Это как реализовать интерфейс Comparator. Очевидно, вы не вернетесь 0. Эта конструкция называется анонимным внутренним классом. Это имеет смысл, если вы собираетесь использовать эту реализацию только в одном месте.

1

Это приемлемый способ кодирования. Компилятор сделает вашу реализацию интерфейса Comparator в классе. Поскольку вы не предоставляете имя для класса, это называется анонимным классом.

У меня нет проблем с использованием анонимных классов, но я предпочитаю использовать переменную для экземпляра анонимного класса. Это дает вам возможность указать имя, в котором указано, какое сравнение будет делать ваш компаратор. В этом случае я мог бы написать что-то вроде этого.

Comparator<Map.Entry<String, Integer>> byValueDescendingThenKey = 
     new Comparator<Map.Entry<String, Integer>>() { 

    @Override 
    public int compare(Map.Entry<String, Integer> entry1, Map.Entry<String, Integer> entry2) { 
     int valueComparison = entry1.getValue().compareTo(entry2.getValue()); 
     if (valueComparison != 0) { 
      return -valueComparison; 
     } else { 
      return entry1.getKey().compareTo(entry2.getKey()); 
     } 
    } 
}; 

Collections.sort(list,byValueDescendingThenKey); 

Обратите внимание, как если есть хороший описательное имя для переменной, которая ссылается на Comparator, линия, которая делает сортировку намного яснее.

0

1) Вы можете реализовать компаратор в отдельный класс и обратиться к нему в качестве второго аргумента в методе

2 Collection.sort()) Или для второго аргумента, вы можете поместить реализацию «в место ", т.е.

Collections.sort((Collection) argument, new Comparator<Map.Entry<String, Integer>>(){ /*your implementation*/} ); 

, который осуществляется через анонимный класс (ваш случай).

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