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
