Java中检查数组是否已排序

IT 文章2年前 (2023)发布 小编
0 0 0

学习检查给定数组是否已按定义的排序顺序(即升序、降序或自定义顺序)排序

1. 概述

如果根据数组的排序顺序,数组中的每一项都大于或小于其前一项,则认为该数组已排序。

要找到这样的元素对,我们必须迭代数组中的所有元素并将其与下一个元素进行比较,如果它违反了排序顺序,则我们得出结论该数组未排序。否则,如果不存在这样的元素对,则对数组进行排序。

ad

程序员导航

优网导航旗下整合全网优质开发资源,一站式IT编程学习与工具大全网站

请注意,数组的排序顺序可以通过以下方式确定:

  • 比较所有基础数据的数值。
  • 实现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实例。

ad

AI 工具导航

优网导航旗下AI工具导航,精选全球千款优质 AI 工具集

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 类,以避免重写这个简单的逻辑。

© 版权声明

相关文章

暂无评论

暂无评论...