Как мне сделать 2 сопоставимых метода только в одном классе? - PullRequest
24 голосов
/ 13 декабря 2010

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

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

Ответы [ 3 ]

60 голосов
/ 13 декабря 2010

Что вам нужно сделать, это реализовать пользовательский 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());
3 голосов
/ 13 декабря 2010

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

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

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

 BookComparator implements Compartor {
   enum FIELD { AUTHOR, ISBN, ... };
   setSortOrder(int rank, FIELD field){...}
 }
3 голосов
/ 13 декабря 2010

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

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

...