【问题标题】:Sorting an ArrayList dependent on the elements field根据元素字段对 ArrayList 进行排序
【发布时间】:2011-01-04 21:25:49
【问题描述】:

我有一个对象数组列表,对象内部有一个年龄字段。如何根据年龄按升序对它们进行排序?

感谢您的宝贵时间

【问题讨论】:

  • 如果您看到喜欢的答案,您可以接受。 ;)

标签: java arrays arraylist sorting


【解决方案1】:

提供一个比较器,例如

Collections.sort(list, new Comparator<MyType>() {
   public int compareTo(MyType t1, MyType t2) {
      return t1.age - t2.age;
   }
}

如果年龄可以很大范围,这是不安全的,但我假设年龄将在 0 到 20 亿之间。 ;)

【讨论】:

  • 如果您不想总是按年龄排序,这是最好的方法。如果您只想按年龄对对象进行排序是有意义的,或者年龄确实是主键,那么让对象实现 Comparable 可能是一种更好的方法。
  • "you would only ever"...开发人员有时不喜欢提交。但是,您始终可以提供 Comparator 即使元素是 Comparable 以以不同的方式排序。
【解决方案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

【讨论】:

    【解决方案3】:

    当您比较没有自然、一致顺序的事物时,您不应该实现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;
                 }
             }
           };
       }
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      相关资源
      最近更新 更多