Подтвердить что ты не робот

Как сделать 2 сопоставимых метода только в одном классе?

У меня есть один класс, который я сортирую уже по одному атрибуту. Теперь мне нужно сделать еще одну вещь, что мне нужно создать другой способ сортировки моих данных. Как я могу это сделать, поэтому я могу выбрать один из двух методов. Единственная команда, которую я знаю, это Collections.sort, которая возьмет метод compareTo из класса, который я хочу сравнить с его данными.

Возможно ли это?

4b9b3361

Ответ 1

Что вам нужно сделать, это реализовать пользовательский Comparator. И затем используйте:

Collections.sort(yourList, new CustomComparator<YourClass>());

В частности, вы можете написать: (Это создаст анонимный класс, который реализует Comparator.)

Collections.sort(yourList, new Comparator<YourClass>(){
    public int compare(YourClass one, YourClass two) {
        // compare using whichever properties of ListType you need
    }
});

Вы можете создать их в своем классе, если хотите:

class YourClass {

    static Comparator<YourClass> getAttribute1Comparator() {
        return new Comparator<YourClass>() {
            // compare using attribute 1
        };
    }

    static Comparator<YourClass> getAttribute2Comparator() {
        return new Comparator<YourClass>() {
            // compare using attribute 2
        };
    }
}

Его можно использовать так:

Collections.sort(yourList, YourClass.getAttribute2Comparator());

Ответ 2

В вашем классе может быть только один метод compareTo().

Если вы хотите отсортировать один и тот же класс более чем одним способом, создайте реализации Comparator.

Ответ 3

Если эти два метода требуют одинакового отпечатка, вы можете ненадлежащим образом перегрузить один класс несколькими способами использования, которые будут устранены путем исправления иерархии классов - например, вместо использования "формы", подкласса с "овалом", "прямоугольник" и т.д.

Если подклассификация не имеет смысла, вам нужно создать разные классы сравнения. В Java вы часто используете Comparator для сравнения. Создайте несколько (или создайте конфигурируемый компаратор): IsbnComparator, AuthorComparator и т.д.

О, и настраиваемый параметр будет:

 BookComparator implements Compartor {
   enum FIELD { AUTHOR, ISBN, ... };
   setSortOrder(int rank, FIELD field){...}
 }