Сортировка массива обьектов
Не получается отсортировать массив обьектов по возврастанию. Нужно отсортировать переданный массив обьектов 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]