Анонимный внутренний класс с использованием Comparable интерфейса - PullRequest
0 голосов
/ 06 октября 2018

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

//Code trying to create treeset using comparable
// compilation error
 TreeSet<String> treeSet5 = new TreeSet<String>(new Comparable<String>() {
        @Override
        public int compareTo(String o) {
            // TODO Auto-generated method stub
            return 0;
        }
    });
  // CE:The constructor TreeSet<String>(new Comparable<String>(){}) is undefined

Я знаю, что для пользовательской сортировки нам нужно использовать компаратор, но мне любопытно, почему мы не можем создать сопоставимый анонимныйкласс.

//Custom sorting: default sorting as String implements comparable
// below code is fine as its working as expected.
    TreeSet<String> treeSet2 = new TreeSet<String>(new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            return o2.compareTo(o1);

        }
    });

Ответы [ 3 ]

0 голосов
/ 06 октября 2018
  1. Сортировка может быть выполнена путем сравнения двух сущностей.
  2. Класс сортировки Util, такой как TreeSet, требует Comparator, поскольку он имеет два параметра, с которыми можно сравнивать.
  3. Comparable не имеет достаточной информации о том, как сравнивать его с другим элементом.

Q: Теперь вы спросите, как это работает, когда в Sorting Item реализовано Comparable?

A: В этом случае сортировочный элемент является первым сравниваемым элементом, а другой элемент передается его методу compareTo(String o)

0 голосов
/ 06 октября 2018

На самом деле, я понял ниже, как только увидел API TreeSet.

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

Treeset treeSet=new TreeSet();
//Creates empty tree set. All objects are inserted according to natural sorting order.
Treeset treeSet=new TreeSet(Comparator c);
//Creates empty treeSet object, objects are maintained according to defined Comparator.
TreeSet treeSet = new TreeSet(Collection c)
0 голосов
/ 06 октября 2018

Comparable используется для создания класса, который можно сравнить с самим собой.

Компаратор должен использоваться с классами, которые не реализуют Comparable (по какой-либо причине, например, от стороннего производителя), или вы хотите сравнить их не так, как в исходном методе compareTo (), не наследуя их.

Надеюсь, что это имеет смысл для вас.

Вот подробный пример: https://www.geeksforgeeks.org/comparable-vs-comparator-in-java/

...