Я создал класс Animal:

public class Animal{
     private String name; 
     private String color;
     etc...
}

Затем у меня есть список животных:

ArrayList<Animal> animals = new ArrayList<Animal>();

Я хотел бы отсортировать этот список животных по их названиям в алфавитном порядке. Есть ли метод, который мне нужно переопределить в моем классе Animal? Как это работает?

0
Talen Kylon 19 Фев 2016 в 23:05

2 ответа

Лучший ответ

В классе Animal ничего менять не нужно. Просто используйте Comparator ( предполагая, что у вас есть метод getName, который возвращает имя):

animals.sort(Comparator.comparing(Animal::getName));

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

animals.sort(Comparator.comparing(Animal::getName, String.CASE_INSENSITIVE_ORDER));

Если вы используете версию Java & lt; 8 используйте { {X0}} и анонимный класс как Comparator (или используйте любой другой способ получить экземпляр Comparator, сравнивая Animal соответствующим образом):

Collections.sort(animals, new Comparator<Animal>() {

    @Override
    public int compare(Animal a1, Animal a2) {
        return a1.getName().compareTo(a2.getName()); // or different code comparing the Animals
    }

});
3
fabian 19 Фев 2016 в 20:46

Вы можете использовать потоки, если вы также используете java 8 для сортировки.

ArrayList<Animal> sortedAnimals = (ArrayList<Animal>) animals.stream().sorted((a1, a2)->a1.name.compareTo(a2.name)).collect(Collectors.toList());

sorted принимает компаратор, поэтому вы можете делать что-то вроде этого:

ArrayList<Animal> sortedAnimals = (ArrayList<Animal>) animals.stream().sorted(Comparator.comparing(Animal::getName)).collect(Collectors.toList());

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

ArrayList<Animal> sortedAnimals = animals.stream().sorted(Comparator.comparing(Animal::getName)).collect(Collectors.toCollection(ArrayList<Animal>::new));
0
gonzo 19 Фев 2016 в 20:35