Сортировки с помощью Java Comparable и Comparator — КиберПедия 

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Сортировки с помощью Java Comparable и Comparator

2022-10-27 34
Сортировки с помощью Java Comparable и Comparator 0.00 из 5.00 0 оценок
Заказать работу

Java предоставляет встроенные методы для сортировки массива примитивных типов, объектов, массивов и списков.

Рассмотрим различные способы сортировки используя java.lang.Comparable и java.util.Comparator.

Для начала давайте посмотрим пример сортировки примитивных типов и пример сортировки массива объектом в программе ниже:

package ua.com.prologistic;

 

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collections;

import java.util.List;

public class JavaObjectSorting {

public static void main(String[] args) {

// сортируем массив int'ов

int[] intArr = {5,9,1,10};

Arrays.sort(intArr);

System.out.println(Arrays.toString(intArr));

 

// сортируем массив объектов String

String[] strArr = {"A", "C", "B", "Z", "E"};

Arrays.sort(strArr);

System.out.println(Arrays.toString(strArr));

 

// сортируем список объектов классов-оболочек

List<String> strList = new ArrayList<String>();

strList.add("A");

strList.add("C");

strList.add("B");

strList.add("Z");

strList.add("E");

// сортируем список встроенным методов сортировки класса Collections

Collections.sort(strList);

for (String str: strList) {

System.out.print(" " + str);

}

}

}

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

[1, 5, 9, 10]

[A, B, C, E, Z]

A B C E Z

Так, а теперь давайте попробуем отсортировать массив объектов нашего собственного класса:

package ua.com.prologistic;

public class Employee {

private int id;

private String name;

private int age;

private long salary;

public int getId() {

return id;

}

public String getName() {

return name;

}

public int getAge() {

return age;

}

public long getSalary() {

return salary;

}

public Employee(int id, String name, int age, int salary) {

this.id = id;

this.name = name;

this.age = age;

this.salary = salary;

}

@Override

// переопределим метод toString() для печати

// информации об объекте Employee в читабельном виде

public String toString() {

return "[id=" + this.id + ", name=" + this.name +

", age=" + this.age + ", salary=" + this.salary + "]";

}

}

Ниже показан фрагмент кода для сортировки массива объектов Employee:

// создаем массив объектов Employee

Employee[] empArr = new Employee[4];

// заполняем массив объектов Employee данными

empArr[0] = new Employee(10, "Andrew", 21, 10000);

empArr[1] = new Employee(20, "Dmitriy", 49, 20000);

empArr[2] = new Employee(5, "Viktor", 45, 5000);

empArr[3] = new Employee(1, "Alex", 42, 50000);

// сортируем массив с использованием Comparable

Arrays.sort(empArr);

System.out.println("Стандартная сортировка для массива объектов Employee:\n"+Arrays.toString(empArr));

Теперь запустим программу и получим ошибку:

Exception in thread "main" java.lang.ClassCastException: ua.com.prologistic.Employee cannot be cast to java.lang.Comparable

at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:290)

at java.util.ComparableTimSort.sort(ComparableTimSort.java:157)

at java.util.ComparableTimSort.sort(ComparableTimSort.java:146)

at java.util.Arrays.sort(Arrays.java:472)

at ua.com.prologistic.JavaSorting.main(JavaSorting.java:41)

В чем причина? Дело в том, что если пользовательский класс в Java хочет использовать встроенные методы сортировки классов Arrays или Collections, то он должен реализовать интерфейс Comparable. Этот интерфейс предоставляет метод compareTo(T obj), который используется методами сортировки. Вы можете убедиться в этом сами, просто посмотрев на реализацию классов String или Date.

Для того, чтобы избежать этой ошибки мы должны переопределить метод compareTo(T obj) таким образом, чтобы он возвращал отрицательное число, ноль или положительное целое число, если «этот» объект меньше, равен или больше объекта, переданного в качестве аргумента.

После реализации интерфейса Comparable класс Employee изменится следующим образом:

package ua.com.prologistic;

import java.util.Comparator;

public class Employee implements Comparable<Employee> {

private int id;

private String name;

private int age;

private long salary;

public int getId() {

return id;

}

public String getName() {

return name;

}

public int getAge() {

return age;

}

public long getSalary() {

return salary;

}

public Employee(int id, String name, int age, int salary) {

this.id = id;

this.name = name;

this.age = age;

this.salary = salary;

}

@Override

public int compareTo(Employee emp) {

//давайте будем сортировать объекты Employee по значению поля id от меньшего к большему

//будем возвращать отрицательное число, 0 или положительное число по каждому сравнению объектов

// здесь мы просто отнимаем значение поля одного объекта от значения поля другого объекта

// в результате получим 1 из 3 вариантов описанных выше вариантов

return (this.id - emp.id);

}

@Override

// переопределяем метод таким образом, чтобы

// он возвращаем информацию об объекте в читабельном виде

public String toString() {

return "[id=" + this.id + ", name=" + this.name + ", age=" + this.age + ", salary=" + this.salary + "]";

}

}

Теперь, когда мы запустим этот код, то получим в консоль вывод отсортированного массива в читабельном виде:

Стандартная сортировка для массива объектов Employee:

[[id=1, name=Alex, age=32, salary=50000], [id=5, name=Viktor, age=35, salary=5000], [id=10, name=Andrew, age=25, salary=10000], [id=20, name=Dmitriy, age=29, salary=20000]]

Как видно из вывода в консоль, массив объектов Employee отсортирован по id в порядке возрастания.

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

С помощью метода Comparable.compareTo(Object o) можно отсортировать объекты только по одному полю. Вот для таких вот ситуаций лучше всего использовать компаратор.

Метод компаратора compare(Object o1, Object o2) принимает два объекта в качестве аргумента и должен быть реализован таким образом, чтобы возвращать отрицательное число — если первый аргумент меньше второго, ноль — если они равны и положительное число, если первый аргумент больше, чем второй.

Оба интерфейса Comparable и Comparator использует дженерики.

Давайте посмотрим на реализацию компаратора в классе Employee:

// компаратор сортирует список или массив объектов по зарплате

public static Comparator<Employee> SalaryComparator = new Comparator<Employee>() {

@Override

public int compare(Employee e1, Employee e2) {

return (int) (e1.getSalary() - e2.getSalary());

}

};

// компаратор сортирует список или массив объектов по возрасту

public static Comparator<Employee> AgeComparator = new Comparator<Employee>() {

@Override

public int compare(Employee e1, Employee e2) {

return e1.getAge() - e2.getAge();

}

};

// компаратор сортирует список или массив объектов по имени

public static Comparator<Employee> NameComparator = new Comparator<Employee>() {

@Override

public int compare(Employee e1, Employee e2) {

return e1.getName().compareTo(e2.getName());

}

};

Все представленные выше реализации интерфейса Comparator являются анонимными классами.

Мы можем использовать эти компараторы передавая их в качестве аргумента для сортировки массивов или коллекций.

//сортируем массив объектов с помощью Comparator по зарплате

Arrays.sort(empArr, Employee.SalaryComparator);

System.out.println("Сортировка по зарплате:\n"+Arrays.toString(empArr));

 

//сортируем массив объектов с помощью Comparator по возрасту

Arrays.sort(empArr, Employee.AgeComparator);

System.out.println("Сортировка по возрасту:\n"+Arrays.toString(empArr));

 

//сортируем массив объектов с помощью Comparator по имени

Arrays.sort(empArr, Employee.NameComparator);

System.out.println("Сортировка по имени:\n"+Arrays.toString(empArr));

Еще примеры

1) Простые способы для того, чтобы найти максимальное число в массиве в Java. Сперва воспользуемся методом Math.max() или оптимальное через сравнение.

public class Test { public static void main(String[] args) { // Нахождение максимального элемента в массиве myArray из 4 элементов типа double. double[] myArray = {11, 5.8, 11.1, 10.9};         // Переменной max задаем минимальное double-значение. double max = Double.MIN_VALUE; // Перебираем все элементы массива. for (int i = 0; i < myArray.length; i++) {     // Переменной max с помощью метода Math.max() присваиваем максимальное значение           // путем выбора наибольшего из двух значений ("старого" значения max и значения элемента).           max = Math.max(max, myArray[i]); } // Выводим на экран наибольшее число массива myArray. System.out.println("Максимальный элемент в массиве myArray: " + max); }}

2) Перебор циклом for

double[] myList = {2.5, 1.8, 1.3, 6.5, 22.8}; // Инициализируем переменную total.double total = 0;

 

for(double element: myList) {     total += element; }

3) Вывод массива на экран с помощью улучшенного цикла for.

System.out.print("Вывод элементов массива myList: "); for(double element: myList) {    System.out.print(element + ", "); }

 


Поделиться с друзьями:

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.021 с.