Это статья о сортировке, в которой я расскажу, как мы можем сортировать массив объектов по нескольким полям в 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);

Вторая проблема заключается в сортировке массива по зарплате, а затем по имени.

Идея, стоящая за этим, довольно проста.

  1. Мы должны сравнить основное поле.
  2. Только когда оба основных поля совпадают, мы должны вернуть сравнение дополнительного поля. (Поэтому, если полей больше, вы можете расширять их аналогичным образом)

Теперь давайте посмотрим на это в действии

// 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, которые мы собираемся использовать.

  1. 0 == false [Это будет правдой]
  2. (false || (2-3)) [Это будет -1]
  3. (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 .