文
章
目
录
章
目
录
学习检查给定数组是否已按定义的排序顺序(即升序、降序或自定义顺序)排序。
1. 概述
如果根据数组的排序顺序,数组中的每一项都大于或小于其前一项,则认为该数组已排序。
要找到这样的元素对,我们必须迭代数组中的所有元素并将其与下一个元素进行比较,如果它违反了排序顺序,则我们得出结论该数组未排序。否则,如果不存在这样的元素对,则对数组进行排序。
请注意,数组的排序顺序可以通过以下方式确定:
- 比较所有基础数据的数值。
- 实现Comparable接口的 Java 对象根据重写的compareTo()方法中提供的逻辑进行比较。
- 所有其他 Java 对象必须通过Comparator接口的实例传递排序顺序。
- 为了反转任何比较逻辑,我们始终可以使用Comparator.reversed()实例。
2. 检查排序数组
2.1. 基础数据类型数组
要检查基础数据类型数组的排序,我们必须检查循环中数组项的顺序。这需要按升序或降序完成。
- 为了检查升序,我们使用noneMatch() API,如果流中没有元素与提供的断言匹配,该 API 返回 true。请注意,如果 API 在到达数组末尾之前能够找到匹配对,则它可能不会评估所有元素上的谓词。
- 要检查降序,请使用allMatch() API。
int[] array = { 1, 2, 3, 4, 5 };
boolean isSorted = checkIsSortedPrimitiveArrayWithStream(array);
System.out.println(isSorted); //true
public static boolean checkIsSortedPrimitiveArrayWithStream(
final int[] array) {
if (array == null || array.length <= 1) {
return true;
}
return IntStream.range(0, array.length - 1)
.noneMatch(i -> array[i] > array[i + 1]);
}
2.2. 用于 Comparable 对象的检查已排序的数组
如果存储在数组中的对象实现了Comparable接口,那么我们可以使用compareTo ()方法来检查对象是否相等,同时比较对象项的自然顺序。
Integer[] array = { 1, 2, 3, 4, 5 };
isSorted = checkIsSortedObjectArrayWithStream(ArrayUtils.toObject(array));
System.out.println(isSorted); //true
public static <T extends Comparable<? super T>>
boolean checkIsSortedObjectArrayWithStream(final T[] array) {
if (array.length <= 1) {
return true;
}
return IntStream.range(0, array.length - 1)
.noneMatch(i -> array[i].compareTo(array[i + 1]) > 0);
}
2.3. 使用 Comparator 检查已排序的数组
如果数组项没有实现Comparable接口,那么为了检查排序数组,我们可以使用Comparator实例。
User[] users = getSortedArray();
Comparator<User> firstNameSorter = Comparator.comparing(User::firstName);
isSorted = checkIsSortedObjectArrayForCustomSort(users, firstNameSorter);
System.out.println(isSorted); //true
public static <T> boolean checkIsSortedObjectArrayForCustomSort(
final T[] array, final Comparator<T> comparator) {
if (comparator == null) {
throw new IllegalArgumentException("Comparator should not be null.");
}
if (array.length <= 1) {
return true;
}
return IntStream.range(0, array.length - 1)
.noneMatch(i -> comparator.compare(array[i], array[i + 1]) > 0);
}
3. Apache Commons 的 ArrayUtils
上述所有方法主要是为了让您了解如何检查排序数组。apache common 的org.apache.commons.lang3.ArrayUtils
类包含一个方法isSorted()
,可以在一行中完成上述所有比较。
User[] users = getSortedArray();
isSorted = ArrayUtils.isSorted(array); //Natural order
System.out.println(isSorted); //true
isSorted = ArrayUtils.isSorted(array,
Comparator.comparing(User::firstName)); //Custom order
System.out.println(isSorted); //true
4. 结论
在这个 Java 教程中,我们学会了检查给定数组是否已排序。我们学会了确定基础数据类型数据数组、实现 Comparable 对象数组和不实现 Comparable 的对象数组的排序性质。
无论选择哪种技术,逻辑都保持不变。因此,建议使用 Apache Commons 的 ArrayUtils 类,以避免重写这个简单的逻辑。