Java中List.sort()自定义排序规则
在Java中,你可以通过以下几种方式为List.sort()方法自定义排序规则:
1. 使用Comparator匿名内部类
List<String> list = Arrays.asList("banana", "apple", "pear", "orange");
list.sort(new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length(); // 按字符串长度排序
}
});
2. 使用Lambda表达式(Java 8+)
List<String> list = Arrays.asList("banana", "apple", "pear", "orange");
list.sort((s1, s2) -> s1.length() - s2.length()); // 按字符串长度排序
3. 使用Comparator的静态方法(Java 8+)
List<String> list = Arrays.asList("banana", "apple", "pear", "orange");
// 按字符串长度排序
list.sort(Comparator.comparingInt(String::length));
// 先按长度,再按字母顺序
list.sort(Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()));
4. 自定义对象排序示例
class Person {
String name;
int age;
// 构造方法、getter/setter省略
}
List<Person> people = Arrays.asList(
new Person("Alice", 25),
new Person("Bob", 20),
new Person("Charlie", 30)
);
// 按年龄排序
people.sort(Comparator.comparingInt(Person::getAge));
// 按年龄降序
people.sort(Comparator.comparingInt(Person::getAge).reversed());
// 多条件排序:先按姓名,再按年龄
people.sort(Comparator.comparing(Person::getName).thenComparingInt(Person::getAge));
5. 实现Comparable接口
如果要对自定义类进行自然排序,可以让类实现Comparable接口:
class Person implements Comparable<Person> {
String name;
int age;
@Override
public int compareTo(Person other) {
return this.age - other.age; // 按年龄排序
}
}
List<Person> people = new ArrayList<>();
// 添加元素...
people.sort(null); // 使用自然排序
注意事项
- compare方法返回负整数、零或正整数,分别表示第一个参数小于、等于或大于第二个参数
- 对于可能产生溢出的数值比较,建议使用
Integer.compare(a, b)
而不是a - b
- 排序是稳定的(相等元素保持原有顺序)
- 对于大型集合,考虑使用并行排序(
list.parallelStream().sorted(...)
)
以上方法可以根据具体需求选择使用,Java 8引入的Lambda和Comparator方法使代码更加简洁易读。