И я хочу сортировать ее иногда по имени, иногда по возрасту, иногда по стране.
Какой самый простой способ добиться этого?
Я знаю, что могу реализовать сопоставимый интерфейс, но это, кажется, ограничивает меня сортировкой по одному определенному свойству.
Переведено автоматически
Ответ 1
Коллекции.сортировка может вызываться с помощью пользовательского компаратора. И этот компаратор может быть реализован для обеспечения сортировки в разных порядках сортировки. Вот пример (для вашей модели Person - с возрастом в виде целого числа):
И вы используете это таким образом (предполагая, что persons - это поле):
publicvoidsortPersonsBy(FlexiblePersonComparator.Order sortingBy) { List<Person> persons = this.persons; // useless line, just for clarification FlexiblePersonComparatorcomparator=newFlexiblePersonComparator(); comparator.setSortingBy(sortingBy); Collections.sort(persons, comparator); // now we have a sorted list }
Ответ 2
Реализуйте интерфейс Comparator (один раз для каждого отдельного порядка сортировки) и используйте метод Collections.sort(), который принимает Comparator в качестве дополнительного параметра.
Ответ 3
Спасибо ответчикам. Для пользы других я хотел бы включить полный пример.
Решение заключается в создании следующих дополнительных классов:
В этом большое преимущество List.sort(cmp) метода расширения по сравнению с Collections.sort(list, cmp). Может показаться, что это всего лишь небольшое синтаксическое преимущество, заключающееся в возможности записи myList.sort(cmp) вместо Collections.sort(myList, cmp). Разница в том, что myList.sort(cmp), являясь методом расширения интерфейса, может быть переопределен конкретной List реализацией. Например, ArrayList.sort(cmp) сортирует список на месте, используя Arrays.sort() тогда как реализация по умолчанию реализует старую технику копирования-сортировки-обратного копирования.