【发布时间】:2011-01-04 21:25:49
【问题描述】:
我有一个对象数组列表,对象内部有一个年龄字段。如何根据年龄按升序对它们进行排序?
感谢您的宝贵时间
【问题讨论】:
-
如果您看到喜欢的答案,您可以接受。 ;)
标签: java arrays arraylist sorting
我有一个对象数组列表,对象内部有一个年龄字段。如何根据年龄按升序对它们进行排序?
感谢您的宝贵时间
【问题讨论】:
标签: java arrays arraylist sorting
提供一个比较器,例如
Collections.sort(list, new Comparator<MyType>() {
public int compareTo(MyType t1, MyType t2) {
return t1.age - t2.age;
}
}
如果年龄可以很大范围,这是不安全的,但我假设年龄将在 0 到 20 亿之间。 ;)
【讨论】:
我认为最好的 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。
【讨论】:
当您比较没有自然、一致顺序的事物时,您不应该实现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;
}
}
};
}
}
【讨论】: