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