Это статья о сортировке, в которой я расскажу, как мы можем сортировать массив объектов по нескольким полям в Java с помощью лямбда-функции и в JavaScript с помощью стрелочных функций.
Сначала рассмотрим Java
Допустим, у нас есть массив объектов Employee. Где Сотрудник — это класс с двумя полями (имя и зарплата).
Первая проблема — отсортировать массив по зарплате. Это, я полагаю, мы все знаем. Итак, мы можем сделать что-то вроде этого.
// let's assume we have an array of Employee - employees // Employee is a class of two fields (String name, int salary) Arrays.sort(employees, (a,b) -> a.salary - b.salary);
Вторая проблема заключается в сортировке массива по зарплате, а затем по имени.
Идея, стоящая за этим, довольно проста.
- Мы должны сравнить основное поле.
- Только когда оба основных поля совпадают, мы должны вернуть сравнение дополнительного поля. (Поэтому, если полей больше, вы можете расширять их аналогичным образом)
Теперь давайте посмотрим на это в действии
// let's assume we have an array of Employees - employees // Employee is a class of two fields (String name, int salary) Arrays.sort(employees, (a, b) -> ((a.salary - b.salary) != 0) ? (a.salary - b.salary): (a.name.compareTo(b.name)));
Если полей больше двух, вы можете расширить их аналогичным образом. Но для этого я бы рекомендовал написать собственный Comparator. Вы можете просто расширить класс Comparator и переопределить метод сравнения.
Этот подход можно использовать даже для сортировки коллекции. Даже этот метод сортировки поддерживает функцию Comparator.
Collections.sort(collection, Comparator function)
Теперь давайте рассмотрим JavaScript
Возьмем аналогичный пример. У нас есть массив объектов Employee. Где каждый объект имеет два поля (имя и зарплата).
Первая проблема — отсортировать массив по зарплате. Это прямо вперед. Мы можем сделать что-то вроде этого.
// We will assume employees is the array employees.sort((a, b) => a.salary - b.salary)
Вторая проблема заключается в сортировке по зарплате, а затем по имени.
Мы будем следовать той же идее, которую уже обсуждали. Итак, мы можем сделать что-то вроде этого.
// We will assume employees is the array employees.sort((a, b) => ((a.salary - b.salary) != 0) ? (a.salary - b.salary): (a.name.localCompare(b.name)));
Но в JavaScript мы можем еще больше упростить это.
Прежде чем мы перейдем к коду, давайте рассмотрим несколько важных приемов JavaScript, которые мы собираемся использовать.
0 == false
[Это будет правдой](false || (2-3))
[Это будет -1](true || (2-3))
[Это будет правдой]
Расширяя пункты 2 и 3, мы можем сказать, что можем заключить, что:
4. ((4-6) || (2-3))
[Это будет -2]
Приведенный выше код мы можем упростить до
// We will assume employees is the array employees.sort((a, b) => (a.salary - b.salary) || (a.name.localCompare(b.name)));
Таким образом, расширение этой идеи на большее количество полей становится проще.
Скажем, если нам нужно отсортировать по трем полям, мы можем просто сделать что-то вроде этого.
array.sort((a,b) => (a.field1 - b.field1) || (a.field2 - b.field2) || (a.field3 - b.field3));
- Выше мы рассмотрели сортировку по возрастанию. Если вам нужно отсортировать любое поле в порядке убывания. Вы можете просто сделать
b-a
вместоa-b
.