Можно ли переопределить compareTo для разных полей
Допустим есть класс Account с полями first типа int и second типа String:
class Account {
int first;
String second;
}
Чтобы можно было выполнить сортировку в классе Account, нужно:
1) реализовать интерфейс Comparable;
2) а после, переопределить метод compareTo()
Ок, делаем:
class Account implements Comparable<Account> {
int first;
String second;
@Override
public int compareTo(Account compare){
int value = ((Account) compare).first;
return this.first - value;
}
}
Но метод compareTo() переопределяется для определенного типа значений. В нашем случае выше - для типа int.
Чтобы выполнить сортировку в порядке возрастания мы делаем следующее:
Account a = new Account();
Collections.sort(a);
Логика: метод sort() интерфейса Collections вызывает наш переопределенный метод compareTo().
А если мне нужно теперь выполнить сортировку по полю second типа String, как быть тогда?
Ответы (1 шт):
Автор решения: Barmaley Red Star
→ Ссылка
Можно выкрутиться примерно так:
class Account implements Comparable<Account> {
int first;
String second;
public static boolean sortByFirst=true;
@Override
public int compareTo(Account account){
if(sortByFirst)
return this.first - account.first;
else
return this.second.compareTo(account.second);
}
}
List<Account> listOfAccount;
//blah-blah
Account.sortByFirst=true;
Collections.sort(listOfAccount); //сортировка по полю first
Account.sortByFirst=false;
Collections.sort(listOfAccount); //сортировка по полю second