Свой порядок сравнения в Java
Интерфейс Comparator<T> описывает функцию
«какой из двух элементов меньше». Его передают в
TreeSet, TreeMap,
PriorityQueue и в List.sort, когда
естественный порядок Comparable не подходит.
Метод compare(a, b) возвращает отрицательное
число, если a идет раньше b, ноль при
равенстве и положительное, если a больше.
Лямбда часто короче отдельного класса.
Сортировка строк по длине, а при равной длине по алфавиту:
import java.util.Comparator;
import java.util.List;
public class Main {
public static void main(String[] args) {
Comparator<String> byLenThenText = Comparator
.comparingInt(String::length)
.thenComparing(Comparator.naturalOrder());
List<String> tags = List.of("log", "api", "io");
var sorted = tags.stream().sorted(byLenThenText).toList();
System.out.println(sorted);
}
}
Фабричные методы comparing,
comparingInt и цепочка thenComparing
собирают правило по частям. Для обратного порядка
есть reversed и reverseOrder:
import java.util.Comparator;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
TreeSet<Integer> desc = new TreeSet<>(Comparator.reverseOrder());
desc.add(4);
desc.add(1);
desc.add(7);
System.out.println(desc);
}
}
Дан список строк:
var strings = List.of("bb", "a", "ccc");
Отсортируйте его по длине строки по возрастанию и выведите результат.