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

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

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


person Gondim    schedule 13.12.2010    source источник
comment
Если вместо вещей и способов можно использовать более явные слова, то давать хорошие ответы будет легче. В нынешнем виде я должен с уважением признать, что изо всех сил пытался понять точный вопрос.   -  person lance.dolan    schedule 06.03.2018


Ответы (3)


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

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

В частности, вы можете написать: (Это создаст класс Anonymous, реализующий 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());
person jjnguy    schedule 13.12.2010

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

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

person jzd    schedule 13.12.2010

Если для двух методов требуется один и тот же размер, возможно, вы неуместно перегружаете один класс несколькими вариантами использования, что можно решить, исправив иерархию классов — например, вместо использования «формы» подклассируйте его с помощью «овал», «прямоугольник» , и т.д.

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

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

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