Как реализовать Сomparable

static int partition(Trainee[] trainees, int left, int right) {
    Trainee pivot = trainees[right];
    int i = left - 1;
    for (int j = left; j < right; j++) {
        if (compare(trainees[j], pivot)) {
            i++;
            swap(trainees, i, j);
        }
    }
    swap(trainees, i + 1, right);
    return i + 1;
}

static boolean compare(Trainee left, Trainee pivot) {
    if (left.solvedProblems < pivot.solvedProblems) {
        return false;
    } else if (left.solvedProblems > pivot.solvedProblems) {
        return true;
    } else {
        if (left.fine > pivot.fine) {
            return false;
        } else if (left.fine < pivot.fine) {
            return true;
        } else {
            return left.login.compareTo(pivot.login) < 0;
        }
    }
}

Ответы (2 шт):

Автор решения: Alex Rudenko

В коде написана попытка реализации интерфейса Comparator в методе compare, но в интерфейсе должно возвращаться int значение.

Реализация же интерфейса Comparable подразумевает, что в классе Trainee должен быть не-статический метод public int compareTo(Trainee t):

public class Trainee implements Comparable<Trainee> {
    // ... существующий код ...

    @Override
    public int compareTo(Trainee that) {
        if (null == that) return 1; // nulls last

        // сравнить по полю solvedProblems в порядке возрастания
        int res = Integer.compare(this.solvedProblems, that.solvedProblems);

        if (0 == res) {
            // сравнить по полю fine в обратном порядке (по убыванию)
            res = Integer.compare(that.fine, this.fine);

            if (0 == res) {
                // сравнить по логину в алфавитном порядке
                res = this.login.compareTo(that.login);
            }
        }
        return res;
    }
}

После реализации интерфейса Comparable массив/список Trainee можно отсортировать при помощи соответствующих методов: Arrays.sort, Collections.sort, List::sort без дополнительных компараторов.

→ Ссылка
Автор решения: стасевич

на примере простого класса с одним полем int.

static class Point {

        int value;

        public Point(int value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return "" + value;
        }
    }

Класс, который реализует Comporator говорит, что "Я реализую функцию сравнения объектов". Единственное, что надо действительно запомнить - это контракт компаратора, который выражается в следующем:
Comparator возвращает int по следующей схеме:
отрицательный int (первый объект отрицательный, то есть меньше)
положительный int (первый объект положительный, то есть больший)
ноль = объекты равны

        ArrayList<Point> list = new ArrayList<>();
// добавляем значения в лист
        list.add(new Point(2));
        list.add(new Point(3));
        list.add(new Point(1));

        System.out.println(list); // вывод [2, 3, 1]

// в параметры сортировки передаём анонимный класс
// с сортировкой по возрастанию,
        list.sort(new Comparator<Point>() {
            @Override
            public int compare(Point o1, Point o2) {
                return Integer.compare(o1.value, o2.value);
// можно сделать по хитрому
//              return o1.value - o2.value;
                // в обратном порядке - вывод [3, 2, 1]
//              return o2.value - o1.value;
            }
        });

        System.out.println(list); // вывод [1, 2, 3]

// можно заменить на лямбду
        list.sort((o1, o2) -> Integer.compare(o1.value, o2.value));

        // или так
//        list.sort(Comparator.comparingInt(o -> o.value));

// сортировка в обратном порядке
        list.sort((o1, o2) -> Integer.compare(o2.value, o1.value));

        System.out.println(list); //вывод [3, 2, 1]
    }
→ Ссылка