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

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

Это вообще возможно?

3 ответов


что вам нужно сделать, это реализовать пользовательский 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());

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

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


Если два метода требуют одного и того же следа, вы можете неправильно перегружать один класс с несколькими использованием, что будет разрешено путем фиксации иерархии вашего класса вместо использования "shape", подкласса с "oval", "rectangle" и т. д.

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

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

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