Сортировка массива обьектов

Не получается отсортировать массив обьектов по возврастанию. Нужно отсортировать переданный массив обьектов Person, но параметру возвраст (age). При этом, в переданных обьектах значение age может быть равно 0, а так же Person может быть null.

Person {
String name;
int age;
}

Какой должен быть порядок: сначала отсортированные по возврастанию обьекты с возврастом (кроме стандартного - 0) - [обьект16лет, обьект17лет, обьект0лет, обьект0лет, null, null]. Подскажите, как это решить самым коротким и грамотным путем , на ваше мнение.


Ответы (2 шт):

Автор решения: Serodv
        Person[] persons = {person0, person16, person0, null, null, person17};
        Arrays.sort(persons, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                // Если оба объекта null либо объекты идентичны (одинаковые ссылки), то объекты равны
                if (o1 == o2) {
                    return 0;
                }
                // Если первый объект null (второй не null, т.к. такое условие проверяолсь выше),
                // либо возраст первого объекта 0, то первый объект "больше" второго
                if (o1 == null || o1.age == 0) {
                    return 1;
                }
                // Если второй объект null (первый не null, т.к. такое условие проверяолсь выше),
                // либо возраст второго объекта 0, то первый объект "меньше" второго
                if (o2 == null || o2.age == 0) {
                    return -1;
                }
                // для остальных случаев определяем, что первый объект "больше" второго
                // если его возраст больше
                return o1.age - o2.age;
            }
        });
→ Ссылка
Автор решения: Nowhere Man

Для краткой записи достаточно использовать Comparator.nullsLast + Comparator.comparingInt:

List<Person> persons = new ArrayList<>(Arrays.asList(
    new Person("Jack", 16), null, new Person("John", 0), new Person("Jeff", 17), null
));

persons.sort(Comparator.nullsLast(
    Comparator.comparingInt(p -> p.getAge() == 0 ? Integer.MAX_VALUE : p.getAge())
));

System.out.println(persons);

Результат:

[Jack 16 yrs, Jeff 17 yrs, John 0 yrs, null, null]
→ Ссылка