Как реализовать С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 шт):
В коде написана попытка реализации интерфейса 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]
}