У меня есть объект массива с возрастом, внутренним по отношению к объектам. Как я могу сортировать их в порядке возрастания в зависимости от их возраста?Сортировка ArrayList в зависимости от поля элементов
Спасибо за ваше время
У меня есть объект массива с возрастом, внутренним по отношению к объектам. Как я могу сортировать их в порядке возрастания в зависимости от их возраста?Сортировка ArrayList в зависимости от поля элементов
Спасибо за ваше время
Предоставить компаратор, например.
Collections.sort(list, new Comparator<MyType>() {
public int compareTo(MyType t1, MyType t2) {
return t1.age - t2.age;
}
}
Если возраст может быть большой выбор, это не безопасно, но я предполагаю, что возраст будет находиться в диапазоне от 0 до 2 миллиардов долларов. ;)
Это лучший подход, если вы не всегда хотите сортировать по возрасту. Если имеет смысл, что вы только когда-либо захотите сортировать объект по возрасту или возрасту, это действительно первичный ключ, то, возможно, для реализации объекта Comparable является лучшим подходом. – LINEMAN78
«вы бы только когда-либо» ... разработчикам иногда не нравится совершать какие-либо действия. Однако вы всегда можете предоставить Comparator, даже если элементы Comparable сортируются по-другому. –
Всякий раз, когда вы сравниваете вещи, которые не имеют естественного последовательного заказа, вы не должны внедрять Comparable
. Внесите вместо этого Comparator
. Причина этого в том, что критерии сортировки не являются неотъемлемой частью объекта ... кто может сказать, что 12-летний «больше», чем 11-летний? Что, если 11-летний возраст выше? Имеет более ранний день рождения? Подобные сравнения являются произвольными и имеют отношение к контексту, в котором они используются, а не по существу для самого человека.
Это не обязательно означает, что вам необходимо предоставить дополнительные данные. Вы можете легко выставить компаратор, все еще инкапсулируя поле age
, если хотите. Что-то вроде этого:
class Person {
int age;
public Comparator<Person> ageComparator() {
return new Comparator<Person>() {
public int compare(Person a, Person b) {
if (a.age > b.age) {
return 1;
} else if (a.age < b.age) {
return -1;
} else {
return 0;
}
}
};
}
}
Google гуавы способ сделать это было бы лучше, я думаю:
Collections.sort(list, Ordering.natural().onResultOf(Person.ageFunction()));
Это предполагает существование Person.ageFunction()
:
public Function<Person, Integer> ageFunction() {
return new Function<Person, Integer>() {
@Override public Integer apply(Person person) {
return person.age;
}
};
}
Оба Ordering
и Google гуавы супер удобны, должны быть инструментом в любом инструменте Java-программиста. См. Guava home page.
Если вы видите ответ, который вам нравится, вы можете его принять. ;) –