Что не так с моим сопоставимым методом? Пытаюсь отсортировать поля int внутри объектов

#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)); есть ли другой класс, который мне нужно импортировать? Куда бы вы посоветовали мне вставить этот код? Какой существующий в настоящее время код я бы опустил?