#java #eclipse #sorting
#java #eclipse #сортировка
Вопрос:
Я хочу отсортировать Employee
объекты по возрасту в порядке возрастания. Я могу сказать, что это не работает, потому что, когда я печатаю список, используя оба Collections.sort
и Collections.reverse
, результат тот же. Кто-нибудь может увидеть, что не так?
package simplejavaassignment;
import simplejavaassignment.Department.DepartmentType;
//fields
public class Employee implements Comparable<Employee>
{
String name;
int age;
DepartmentType department;
public Employee(String name, int age, DepartmentType department)
{
this.name = name;
this.age = age;
this.department = department;
}
@Override
public int compareTo(Employee compareAge)
{
return this.age-compareAge.age;
}
}
и
package simplejavaassignment;
import java.util.*;
import java.util.Collections;
import simplejavaassignment.Employee;
public class Department
{
enum DepartmentType {ACCOUNTING, MARKETING, HUMAN_RESOURCES, INFORMATION_SYSTEMS}
public static void main(String[] args)
{
ArrayList<Employee> employeeList = new ArrayList<Employee>();
employeeList.add(new Employee("Counting Guru", 55, DepartmentType.ACCOUNTING));
employeeList.add(new Employee("Counting Pro", 45, DepartmentType.ACCOUNTING));
employeeList.add(new Employee("Counting Savvy", 40, DepartmentType.ACCOUNTING));
employeeList.add(new Employee("Counting Novice", 25, DepartmentType.ACCOUNTING));
employeeList.add(new Employee("Sales Guru", 50, DepartmentType.MARKETING));
employeeList.add(new Employee("Sales Pro", 48, DepartmentType.MARKETING));
employeeList.add(new Employee("Sales Savvy", 38, DepartmentType.MARKETING));
employeeList.add(new Employee("Hiring Guru", 58, DepartmentType.HUMAN_RESOURCES));
employeeList.add(new Employee("Hiring Pro", 47, DepartmentType.HUMAN_RESOURCES));
employeeList.add(new Employee("Hacking Pro", 46, DepartmentType.INFORMATION_SYSTEMS));
employeeList.add(new Employee("Hacking Guru", 51, DepartmentType.INFORMATION_SYSTEMS));
employeeList.add(new Employee("Hacking Savvy", 38, DepartmentType.INFORMATION_SYSTEMS));
employeeList.add(new Employee("Hacking Novice", 23, DepartmentType.INFORMATION_SYSTEMS));
Collections.sort(employeeList);
System.out.println(employeeList);
}
}
Ответ №1:
У меня работает. Когда я запускаю ваш код, он правильно сортирует список в порядке возрастания возраста сотрудника и печатает его в этом порядке. Однако вам следует добавить toString()
метод в свой класс Employee, чтобы вы действительно могли видеть, что он печатает.
P.S. Имейте в виду, что вычитание сравниваемых целых чисел не будет работать корректно, если значения будут чрезвычайно большими, потому что результат тогда переполнится. Наилучшей практикой было бы заменить вычитание на Integer.compare(this.age, compareAge.age)
.
P.P.S. В Java 8 или выше самым простым способом выполнить такую сортировку было бы не заморачиваться с методом compareTo или сопоставимым интерфейсом, а просто написать либо:
employeeList.sort((e1, e2) -> Integer.compare(e1.age, e2.age));
или:
employeeList.sort(Comparator.comparingInt(e -> e.age));
Комментарии:
1. @zulualph
[23, 25, 38, 38, 40, 45, 46, 47, 48, 50, 51, 55, 58]
. Это с помощью простогоtoString()
метода в классе Employee, который просто возвращает возраст:@Override public String toString() { return "" age; }
2. Это странно — когда я добавляю это, я получаю то же самое, но нет никаких указаний на то, что это работает при запуске
Department
класса. Я полный новичок и не знал, как использоватьtoString()
метод. Большое вам спасибо за ваш ответ.3. @zulualph Тогда как вы пришли к выводу, что список не был отсортирован, если вы не могли видеть его содержимое?
4. Ну,
Collections.sort
иCollections.reverse
дало бы противоположные результаты, верно? Когда я попытался ввести их оба по отдельности и запуститьDepartment
, в распечатанном выводе не было никакой разницы. Я предполагаю, что что-то в корне не так с моим методом тестирования.5. Итак, если бы я использовал этот
employeeList.sort((e1, e2) -> Integer.compare(e1.age, e2.age));
есть ли другой класс, который мне нужно импортировать? Куда бы вы посоветовали мне вставить этот код? Какой существующий в настоящее время код я бы опустил?