Как сделать 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){...} }