Можно ли переопределить 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
→ Ссылка