История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
Топ:
Проблема типологии научных революций: Глобальные научные революции и типы научной рациональности...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов...
Устройство и оснащение процедурного кабинета: Решающая роль в обеспечении правильного лечения пациентов отводится процедурной медсестре...
Интересное:
Национальное богатство страны и его составляющие: для оценки элементов национального богатства используются...
Инженерная защита территорий, зданий и сооружений от опасных геологических процессов: Изучение оползневых явлений, оценка устойчивости склонов и проектирование противооползневых сооружений — актуальнейшие задачи, стоящие перед отечественными...
Искусственное повышение поверхности территории: Варианты искусственного повышения поверхности территории необходимо выбирать на основе анализа следующих характеристик защищаемой территории...
Дисциплины:
2022-10-27 | 35 |
5.00
из
|
Заказать работу |
|
|
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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!