Еще один хороший способ сделать это немного более гибким, если существует более одного свойства объекта, по которому вы, возможно, захотите отсортировать, - это использовать Guava Порядок класс с его onResultOf(Function)
опцией.Это идеально подходит для сортировки по свойствам, поскольку Функция может использоваться для извлечения и возврата определенного свойства объекта.В качестве простого примера представьте класс Person
с методами String getFirstName()
и String getLastName()
.
List<Person> people = ...;
Collections.sort(people, Ordering.natural().onResultOf(
new Function<Person, String>() {
public String apply(Person from) {
return from.getFirstName();
}
}));
Выше приведен список, отсортированный по имени.
Чтобы он читалсялучше, вы можете определить функции, которые вы можете использовать в качестве полей public static final
в классе Person
.Затем вы можете отсортировать по фамилии следующим образом:
Collections.sort(people, Ordering.natural().onResultOf(Person.GET_LAST_NAME));
Как забавное примечание, все это будет намного проще в Java 8 с лямбда-выражениями и ссылками на методы.Вы сможете написать что-то вроде этого без необходимости определять какие-либо неуклюжие анонимные внутренние классы или статические конечные поля:
import static java.util.Comparator.comparing;
...
people.sort(comparing(Person::getLastName));