在实际开发中,列表排序是常见的操作之一。Java 提供了多种排序方式,包括使用 Collections.sort()
、List.sort()
以及结合 Comparator
实现自定义排序。以下是一些实用的排序技巧和代码示例。
对于基本数据类型或已实现 Comparable
接口的对象,可以直接使用 Collections.sort()
进行排序。例如,对 Integer
列表进行排序:
List numbers = Arrays.asList(5, 3, 8, 1, 2);
Collections.sort(numbers);
System.out.println(numbers); // 输出 [1, 2, 3, 5, 8]
如果需要对自定义对象排序,需要确保对象实现 Comparable
接口或提供 Comparator
。以下是实现 Comparable
的示例:
class Person implements Comparable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.age);
}
@Override
public String toString() {
return name + "(" + age + ")";
}
}
List people = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", 25),
new Person("Charlie", 35)
);
Collections.sort(people);
System.out.println(people); // 输出 [Bob(25), Alice(30), Charlie(35)]
Comparator
提供了更灵活的排序方式,可以在不修改对象类的情况下定义排序规则。例如,按姓名排序:
Comparator byName = Comparator.comparing(Person::getName);
people.sort(byName);
System.out.println(people); // 输出 [Alice(30), Bob(25), Charlie(35)]
还可以组合多个排序条件。例如,先按年龄升序,再按姓名降序:
Comparator byAgeThenName = Comparator
.comparingInt(Person::getAge)
.thenComparing(Comparator.comparing(Person::getName).reversed());
people.sort(byAgeThenName);
System.out.println(people); // 输出 [Bob(25), Alice(30), Charlie(35)]
在 Java 8 及更高版本中,可以使用 Lambda 表达式进一步简化 Comparator
的写法:
people.sort((p1, p2) -> p1.getAge() - p2.getAge());
System.out.println(people); // 输出 [Bob(25), Alice(30), Charlie(35)]
或者使用方法引用:
people.sort(Comparator.comparingInt(Person::getAge));
System.out.println(people); // 输出 [Bob(25), Alice(30), Charlie(35)]
字符串列表的默认排序是按字典序。如果需要忽略大小写排序:
List names = Arrays.asList("Alice", "bob", "Charlie", "dave");
names.sort(String.CASE_INSENSITIVE_ORDER);
System.out.println(names); // 输出 [Alice, bob, Charlie, dave]
如果需要按字符串长度排序:
names.sort(Comparator.comparingInt(String::length));
System.out.println(names); // 输出 [bob, dave, Alice, Charlie]
在列表中包含 null
值时,可以通过 Comparator.nullsFirst
或 Comparator.nullsLast
处理:
List namesWithNull = Arrays.asList("Alice", null, "Bob", null);
namesWithNull.sort(Comparator.nullsFirst(Comparator.naturalOrder()));
System.out.println(namesWithNull); // 输出 [null, null, Alice, Bob]
对于大型列表,可以使用 parallelSort
提高排序性能:
List largeList = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
largeList.add((int) (Math.random() * 100000));
}
largeList.parallelStream().sorted().collect(Collectors.toList());
Java 提供了丰富的列表排序方法,从简单的自然排序到复杂的自定义排序,开发者可以根据需求灵活选择。通过 Comparator
和 Lambda 表达式,排序逻辑可以更加简洁和高效。对于特殊需求(如 null
值处理或多条件排序),Comparator
也提供了完善的解决方案。