Как сделать 2 сопоставимых метода только в одном классе?
У меня есть один класс, который я сортирую уже по одному атрибуту.
Теперь мне нужно сделать еще одну вещь, что мне нужно создать другой способ сортировки моих данных.
Как я могу это сделать, поэтому я могу выбрать один из двух методов.
Единственная команда, которую я знаю, это Collections.sort, которая возьмет метод compareTo из класса, который я хочу сравнить с его данными.
Возможно ли это?
Ответы
Ответ 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){...}
}