根据elements字段对ArrayList进行排序

时间:2011-01-04 21:25:49

标签: java arrays arraylist sorting

我有一个对象的arraylist,在对象内部有一个age字段。如何根据年龄按升序对它们进行排序?

感谢您的时间

3 个答案:

答案 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;
             }
         }
       };
   }
}