Статьи

Сортировка списка с нулевыми значениями с помощью nullsFirst в Comparator

Привет друзья,

В этом уроке мы увидим, как мы можем отсортировать список элементов, когда немногие из элементов являются нулевыми в списке, используя Java 8 Comparator.nullsFirst, так что нулевые значения обрабатываются как наименьшие элементы в списке.

— Что такое компаратор
Метод nullsFirst делает в компараторе
— Сортировка списка строк, имеющих ненулевые имена
— Сортировка списка строк с именами и нулями без использования nullsFirst
— Решение вышеуказанной проблемы путем сортировки списка методом nullsFirst
— сортировка списка пользовательских объектов без нуля
— Сортировка списка пользовательских объектов с нулями без использования nullsFirst
— Решение вышеуказанной проблемы путем сортировки списка методом nullsFirst
— Сортировка списка с сотрудником с именем, равным нулю

Что такое компаратор?

Компаратор — это FunctionalInterface, который имеет следующий абстрактный метод

int сравнивать (T
о1, т
о2);

Так что если вы хотите отсортировать, скажем, ваш список. Вы можете создать класс, реализующий метод сравнения интерфейса Comparator, в котором вы можете определить логику сортировки и передать этот компаратор в метод list.sort (), и он будет сортироваться в соответствии с вашим определенная логика.

В качестве альтернативы, вместо создания отдельного класса, реализующего интерфейс Comparator, вы можете передать лямбда-функцию (реализующую метод сравнения Comparator) в метод list.sort ().

Что делает метод nullsFirst в Comparator?

В Java 8 было добавлено множество стандартных и статических методов в интерфейсе Comparator.

nullsFirst — это один из статических методов, определенных в интерфейсе Comparator, имеющий следующую подпись:

общественности
статический <T> Comparator <T> nullsFirst (Comparator <?
супер T>
компаратор)

Так что же это делает?

Возвращает дружественный к нулю компаратор, который считает, что ноль меньше чем ноль.

— Когда оба объекта равны нулю, они считаются равными.

— Если оба значения не равны NULL, указанный компаратор, который передается методу nullsFirst в качестве параметра, используется для определения порядка сортировки.

— Когда указанный компаратор равен нулю, возвращенный компаратор считает все ненулевые значения равными.

Чтобы понять использование nullsFirst, давайте попробуем отсортировать список строк, имеющих имена сотрудников,

— сначала без нулевых значений

— затем с нулевыми значениями, но без nullsFirst

— затем с нулевыми значениями и с нулевыми значениями

— Затем мы сделаем те же самые шаги для пользовательского объекта Employee.

— И тогда мы увидим, что если в пользовательском объекте одно из свойств, на основе которого должна быть выполнена сортировка, является нулевым

Сортировка списка строк с ненулевыми именами

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
package com.blogspot.javasolutionsguide;
 
 
import java.util.Arrays;
import java.util.List;
import java.util.Comparator;
 
 
public class ComparatorTestWithListOfNamesWithoutNulls {
 
 public static void main(String[] args) {
 
    List<String> names  = Arrays.asList("Gaurav", "Tendulkar", "Suresh", "Rohit", "Bumrah");
    System.out.println("Before Sorting:");
    names.forEach(System.out ::println);
    names.sort(Comparator.naturalOrder());
    System.out.println("After Sorting:");
    names.forEach(System.out ::println);
 }
1
}

Вот вывод:

Перед сортировкой:

Gaurav

Тендулкар

Суреш

Рохит

Bumrah

После сортировки:

Bumrah

Gaurav

Рохит

Суреш
Тендулкар

Сортировка списка строк с именами и нулями без использования nullsFirst

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
package com.blogspot.javasolutionsguide;
 
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
 
 
public class ComparatorTestWithListOfNamesAndNulls {
  public static void main(String[] args) {
     List<String> names  = Arrays.asList("Gaurav", null, "Sachin", "Suresh",null, "Rohit", "Jasprit", null);
     System.out.println("Before Sorting:");
     names.forEach(System.out ::println);
     names.sort(Comparator.naturalOrder());
     System.out.println("After Sorting:");
     names.forEach(System.out ::println);
  }
1
}

Вот вывод:

Перед сортировкой:

Gaurav

ноль

Сэчин

Суреш

ноль

Рохит

Jasprit

ноль

Исключение в теме «главная»
java.lang.NullPointerException

в java.base / java.util.Comparators $ NaturalOrderComparator.compare (
Comparators.java:52)

в java.base / java.util.Comparators $ NaturalOrderComparator.compare (
Comparators.java:47)

в java.base / java.util.TimSort.countRunAndMakeAscending (
TimSort.java:355)

в java.base / java.util.TimSort.sort (
TimSort.java:220)

в java.base / java.util.Arrays.sort (
Arrays.java:1442)

в java.base / java.util.Arrays $ ArrayList.sort (
Arrays.java:4426)

в com.blogspot.javasolutionsguide.ComparatorTestWithListOfNamesAndNulls.main (ComparatorTestWithListOfNamesAndNulls.java:12)

Как мы можем видеть, потому что метод сравнения NaturalOrderComparator пытается сравнить два объекта, вызывая CompareTo для одного из объектов, мы получаем NullPointerException.

Решение вышеуказанной проблемы путем сортировки списка методом nullsFirst

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
package com.blogspot.javasolutionsguide;
 
import java.util.Arrays;
import java.util.List;
import java.util.Comparator;
 
 
 
/**
 * @author javasolutionsguide
 *
 */
public class ComparatorTestWithNullsFirstForListOfNames {
   public static void main(String[] args) {
       List<String> names  = Arrays.asList("Gaurav", null, "Tendulkar", "Suresh",null, "Rohit", "Jasprit", null);
       System.out.println("Before Sorting:");
       names.forEach(System.out ::println);
       names.sort(Comparator.nullsFirst(Comparator.naturalOrder()));
       System.out.println("After Sorting:");
       names.forEach(System.out ::println);
   }
1
}

Вот вывод:

Перед сортировкой:

Gaurav

ноль

Тендулкар

Суреш

ноль

Рохит

Jasprit

ноль

После сортировки:

ноль

ноль

ноль

Gaurav

Jasprit

Рохит

Суреш

Тендулкар

Сортировка списка пользовательских объектов без нуля

Мы создадим класс Employee, который будет простым POJO, как показано ниже:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
package com.blogspot.javasolutionsguide;
 
 
public class Employee {
 
  private int id;
  private String name;
  private String department;
 
  public Employee(int id, String name, String department) {
    super();
    this.id = id;
    this.name = name;
    this.department = department;
  }
 
  public int getId() {
    return id;
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
}
 
  public String getName() {
    return name;
  }
 
  public String getDepartment() {
   return department;
  }
 
  @Override
  public String toString() {
   return "Employee [id=" + id + ", name=" + name + ", department=" + department + "]";
  }
}

И вот наш тестовый класс:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
package com.blogspot.javasolutionsguide;
 
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
 
 
public class ComparatorTestWithListOfEmployeesWithoutNulls {
  public static void main(String[] args) {
      List<Employee> employees = Arrays.asList(new Employee(1, "Gaurav", "IT"),
      new Employee(1, "Tendulkar", "Admin"),
      new Employee(1, "Suresh", "IT"),
      new Employee(1, "Rohit", "Admin"),
      new Employee(1, "Bumrah", "Admin"));
      System.out.println("Before Sorting:");
      employees.forEach(System.out ::println);
      System.out.println("After Sorting:");
      employees.sort(Comparator.comparing(Employee :: getName));
      employees.forEach(System.out::println);
1
}

Вот вывод:

Перед сортировкой:

Сотрудник [id = 1, имя = Гаурав, отдел = IT]

Сотрудник [id = 1, имя = Tendulkar, отдел = Admin]

Сотрудник [id = 1, имя = Суреш, отдел = IT]

Сотрудник [id = 1, имя = Rohit, отдел = Admin]

Сотрудник [id = 1, имя = Bumrah, отдел = Admin]

После сортировки:

Сотрудник [id = 1, имя = Bumrah, отдел = Admin]

Сотрудник [id = 1, имя = Гаурав, отдел = IT]

Сотрудник [id = 1, имя = Rohit, отдел = Admin]

Сотрудник [id = 1, имя = Суреш, отдел = IT]

Сотрудник [id = 1, имя = Tendulkar, отдел = Admin]

Сортировка списка пользовательских объектов с нулями без использования nullsFirst

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
package com.blogspot.javasolutionsguide;
 
 
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
 
 
public class ComparatorTestWithListOfEmployeesWithNulls {
 
  public static void main(String[] args) {
  
   List<Employee> employees = Arrays.asList(new Employee(1, "Gaurav", "IT"),
   null,
   new Employee(1, "Tendulkar", "Admin"),
   new Employee(1, "Suresh", "IT"),
1
2
3
4
5
6
7
null,
   new Employee(1, "Rohit", "Admin"),
   new Employee(1, "Bumrah", "Admin"),
   null);
 
   employees.sort(Comparator.comparing(Employee::getName));
   employees.forEach(System.out::println);
1
}
1
}

Вот вывод:

Перед сортировкой:

Сотрудник [id = 1, имя = Гаурав, отдел = IT]

ноль

Сотрудник [id = 1, имя = Tendulkar, отдел = Admin]

Сотрудник [id = 1, имя = Суреш, отдел = IT]

ноль

Сотрудник [id = 1, имя = Rohit, отдел = Admin]

Сотрудник [id = 1, имя = Bumrah, отдел = Admin]

ноль

Исключение в теме «главная»
java.lang.NullPointerException

в java.base / java.util.Comparator.lambda $, сравнивая $ 77a9974f $ 1 (
Comparator.java:469)

в java.base / java.util.TimSort.countRunAndMakeAscending (
TimSort.java:355)

в java.base / java.util.TimSort.sort (
TimSort.java:220)

в java.base / java.util.Arrays.sort (
Arrays.java:1442)

в java.base / java.util.Arrays $ ArrayList.sort (
Arrays.java:4426)

at com.blogspot.javasolutionsguide.ComparatorTestWithListOfEmployeesWithNulls.main (ComparatorTestWithListOfEmployeesWithNulls.java:19)

Решение вышеуказанной проблемы путем сортировки списка методом nullsFirst

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
package com.blogspot.javasolutionsguide;
 
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
 
 
public class ComparatorTestWithListOfEmployeesWithNullsAndNullsFirst {
 
  public static void main(String[] args) {
 
     List<Employee> employees = Arrays.asList(new Employee(1, "Gaurav", "IT"),
     null,
     new Employee(1, "Tendulkar", "Admin"),
     new Employee(1, "Suresh", "IT"),
1
2
3
4
5
6
7
8
null,
     new Employee(1, "Rohit", "Admin"),
     new Employee(1, "Bumrah", "Admin"),
     null);
     Collections.sort(employees ,Comparator.nullsFirst((emp1 ,emp2) -> emp1.getName().compareToIgnoreCase(emp2.getName())));
     employees.forEach(System.out::println);
  }
}

Вот вывод:

ноль

ноль

ноль

Сотрудник [id = 1, имя = Bumrah, отдел = Admin]

Сотрудник [id = 1, имя = Гаурав, отдел = IT]

Сотрудник [id = 1, имя = Rohit, отдел = Admin]

Сотрудник [id = 1, имя = Суреш, отдел = IT]

Сотрудник [id = 1, имя = Tendulkar, отдел = Admin]

Сортировка списка с сотрудником с именем, равным нулю

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.blogspot.javasolutionsguide;
 
 
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
 
 
public class ComparatorTestWithListOfEmployeesWithNullNamesAndNullsFirst {
 
  public static void main(String[] args) {
     List<Employee> employees = Arrays.asList(new Employee(1, "Gaurav", "IT"),
     new Employee(1, "Tendulkar", "Admin"),
     new Employee(1, null, "IT"),
     new Employee(1, "Rohit", "Admin"),
     new Employee(1, "Bumrah", "Admin"));
     System.out.println("Before Sorting:");
     employees.forEach(System.out ::println);
     employees.sort(Comparator.comparing(Employee::getName,Comparator.nullsFirst(Comparator.naturalOrder())));
     System.out.println("After Sorting:");
     employees.forEach(System.out::println);
  }
}

Вот вывод:

Перед сортировкой:

Сотрудник [id = 1, имя = Гаурав, отдел = IT]

Сотрудник [id = 1, имя = Tendulkar, отдел = Admin]

Сотрудник [id = 1, name = null, отдел = IT]

Сотрудник [id = 1, имя = Rohit, отдел = Admin]

Сотрудник [id = 1, имя = Bumrah, отдел = Admin]

После сортировки:

Сотрудник [id = 1, name = null, отдел = IT]

Сотрудник [id = 1, имя = Bumrah, отдел = Admin]

Сотрудник [id = 1, имя = Гаурав, отдел = IT]

Сотрудник [id = 1, имя = Rohit, отдел = Admin]

Сотрудник [id = 1, имя = Tendulkar, отдел = Admin]

Резюме

Когда у нас есть список элементов, в которых несколько элементов являются нулевыми, и мы хотим, чтобы эти нулевые значения рассматривались как наименьшие элементы в списке, мы можем использовать метод nullsFirst интерфейса Comparator, который выполняет следующие действия:

Возвращает дружественный к нулю компаратор, который считает, что ноль меньше чем ноль.

— Когда оба объекта равны нулю, они считаются равными.

— Если оба значения не равны NULL, указанный компаратор, который передается методу nullsFirst в качестве параметра, используется для определения порядка сортировки.

— Когда указанный компаратор равен нулю, возвращенный компаратор считает все ненулевые значения равными.

Спасибо за чтение. Если вам понравился пост, вы можете поделиться им и можете подписаться на этот блог для более таких сообщений.

Опубликовано на Java Code Geeks с разрешения Гаурава Бхардваджа, партнера нашей программы JCG . См. Оригинальную статью здесь: Сортировка списка с нулевыми значениями с помощью nullsFirst в Comparator.

Мнения, высказанные участниками Java Code Geeks, являются их собственными.