如何排序Java列表

Collections 类提供了两个标准的静态方法来排序列表:

  • sort(List list) 适用于T extends Comparable 的列表
  • sort(List list, Comparator c) 适用于任何类型的列表。

应用前者需要修改被排序的列表元素的类,这并不总是可能的。它也可能是不受欢迎的,因为尽管它提供了默认的排序,但在不同的情况下可能需要其他排序顺序,或者排序只是一个一次性任务。

假设我们要排序一些下面类实例的对象:

public class User {
    public final Long id;
    public final String username;
    public User(Long id, String username) {
        this.id = id;
        this.username = username;
    }
    @Override
    public String toString() {
         return String.format("%s:%d", username, id);
    }
}

要使用Collections.sort(List list),我们需要修改用户类以实现Comparable接口。
例如

public class User implements Comparable {
      public final Long id;
      public final String username;
      public User(Long id, String username) {
          this.id = id;
          this.username = username;
      }
      @Override
      public String toString() {
           return String.format("%s:%d", username, id);
      }
      @Override
      /** The natural ordering for 'User' objects is by the 'id' field. */
      public int compareTo(User o) {
           return id.compareTo(o.id);
      }
}

(题外话:许多标准Java类,如String、Long、Integer,都实现了类似的接口。这使得这些元素的列表在默认情况下是可排序的,并简化了在其他类中compare或者compareTo的实现。)

通过上面的修改,我们可以根据类的自然顺序轻松地对用户对象列表进行排序(在本例中,我们将其定义为基于id值排序)。
例如:

List users = Lists.newArrayList(
    new User(33L, "A"),
    new User(25L, "B"),
    new User(28L, ""));
Collections.sort(users);
System.out.print(users);
//[B:25, C:28, A:33]

但是,假设我们希望按名称而不是id对用户对象进行排序,或者,假设我们无法更改类以使其实现可比较。
这就是带有Comparator参数的sort方法很有用的地方:

Collections.sort(users, new Comparator() {
    @Override
    /* Order two 'User' objects based on their names. */
    public int compare(User left, User right) {
         return left.username.compareTo(right.username);
    }
});
System.out.print(users);
//[A:33, B:25, C:28]

在Java 8中,我们可以使用Lambda而不是匿名类。
这样可以将代码写成一行

//版本 ≥ Java SE 8
Collections.sort(users, (l, r) -> l.username.compareTo(r.username));

此外,java8在List接口上添加了一个默认的排序方法,这进一步简化了排序。

users.sort((l, r) -> l.username.compareTo(r.username))
日期:2020-06-02 22:15:24 来源:oir作者:oir