我有一个对象的arraylist,在对象内部有一个age字段。如何根据年龄按升序对它们进行排序?
感谢您的时间
答案 0 :(得分:10)
提供比较器,例如
Collections.sort(list, new Comparator<MyType>() {
public int compareTo(MyType t1, MyType t2) {
return t1.age - t2.age;
}
}
如果年龄可能很大,这不安全,但我认为年龄将介于0到20亿之间。 ;)
答案 1 :(得分:2)
我认为Google Guava的做法最好:
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 Guava都非常方便,应该是任何Java程序员工具箱中的工具。请参阅Guava home page。
答案 2 :(得分:0)
每当你比较那些没有自然一致排序的东西时,你就不应该实现Comparable
。而是实施Comparator
。这样做的原因是排序的标准不是对象固有的......谁能说12岁的人比11岁的人“更大”?如果这个11岁的孩子身高怎么办?生日早了吗?这些比较是任意的,与使用它们的背景相关,而不是与人本身有关。
这并不一定意味着您必须公开更多数据。如果您愿意,还可以在封装age
字段的同时轻松公开Comparator。像这样:
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;
}
}
};
}
}