在 Comparable 和 Comparator 接口、数组.sort() 和 Stream.sorted() API。
我们将学习按自然顺序、逆序和任何其他自定义顺序对数组进行排序。
无论我们使用哪种 Java API 进行排序,排序功能背后的基本概念都保持不变。
Comparable
接口实现的顺序排序。Comparator.reverseOrder()
。Comparator
接口的实例,并在其中提供相关的排序行为。然后我们将比较器的一个实例传递给排序 API。现在让我们深入研究演示数组排序的 Java 程序。对于自定义排序,我们将使用 User 类的实例。请注意,id
字段支持默认排序。
public class User implements Comparable<User> {
public long id;
public String firstName;
public String lastName;
//Add getters and setters
@Override
public int compareTo(final User user) {
if(user == null ) {
return -1;
} else {
return (int)(this.id - user.id);
}
}
}
java.util.Arrays
类提供了许多实用程序 static
方法。 sort() API 也是帮助对给定项目数组进行排序的此类方法。
sort() API 实现是一种稳定、自适应、迭代的mergesort,当输入数组部分排序时,它需要的比较次数远少于 n lg(n) 次。当输入数组随机排序时,它提供了传统归并排序的性能。如果输入数组几乎已排序,则实现需要大约 n 次比较。
parallelSort() API 实现是一种双枢轴 quicksort,可在所有数据集上提供 O(n log(n))
性能,并且通常比传统方法更快(单轴)快速排序实现。
public static void sort(array, ?comparator)
public static void parallelSort(array, ?comparator)
Java 程序以默认顺序对 String 数组进行排序。请注意,String 类已经实现了 Comparable 接口。
String[] tokens = {"A","C","B","E","D"};
Arrays.sort(tokens); //[A, B, C, D, E]
Java 程序使用 Comparator.reverseOrder() 来反转自然顺序。
String[] tokens = {"A","C","B","E","D"};
Arrays.sort(tokens, Collections.reverseOrder()); //[E, D, C, B, A]
我们按名字对用户数组进行排序。
User[] users = getUsersArray();
Comparator firstNameSorter = Comparator.comparing(User::getFirstName);
Arrays.sort(users, firstNameSorter);
要对多个字段进行排序,例如 SQL group by clause,我们可以创建一个复杂的Comparator实例并将其用于排序目的。
Comparator fullNameSorter = Comparator.comparing(Employee::getFirstName)
.thenComparing(Employee::getLastName);
Arrays.sort(employees, fullNameSorter);
我们可以使用 Stream.sorted() 方法对基元数组或自定义对象进行排序,其方式与我们使用 Arrays.sort() API 的方式非常相似。
Comparable
,则在执行终端操作时可能会抛出java.lang.ClassCastException
。对于有序流(流是从有序集合生成的,例如 ArrayList),排序是稳定的。对于无序流(例如,从 HashMap 生成的流),不提供稳定性保证。
Stream<T> sorted()
Stream<T> sorted(?comparator)
//1. Natural ordering
User[] sortedUserArray = Stream.of(userArray)
.sorted()
.toArray(User[]::new);
//2. Reverse ordering
User[] sortedUserArray = Stream.of(userArray)
.sorted(Comparator.reverseOrder())
.toArray(User[]::new);
//3. Custom Sorting
Comparator nameComparator = Comparator.comparing(Employee::getName)
.thenComparing(Employee::getId)
User[] sortedUserArray = Stream.of(userArray)
.sorted(nameComparator)
.toArray(User[]::new);
在这个给定的示例中,我们学习了使用 Arrays.sort() 和 Stream API 对数组进行排序。我们学会了按自然顺序、倒序和自定义顺序排序。
快乐学习!!
标签2: Java Sorting地址:https://www.cundage.com/article/java-array-sorting.html