检查数组是否在 Java 中排序

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(349)   2023-06-26 07:54:18

学习检查给定数组是否已排序以定义排序顺序,即升序、降序或自定义顺序。

一、概述

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

要找到这样的项目对,我们必须遍历数组中的所有项目并将其与下一个项目进行比较,如果它违反了排序顺序,则我们断定数组未排序。否则,如果没有这样的项目对,则对数组进行排序。

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

  • 比较所有基元的数值。
  • 实现 Comparable 接口的 Java 对象根据覆盖的 compareTo() 方法中提供的逻辑进行比较。
  • 所有其他 Java 对象必须通过 Comparator 接口的实例传递排序顺序。
  • 为了反转任何比较逻辑,我们总是可以使用 Comparator.reversed() 实例。

2. 检查排序数组

2.1.原始数组

要检查原始数组的排序,我们必须检查循环中数组项的顺序。这需要按升序或降序完成。

  • 为了检查升序,我们使用 noneMatch() 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 接口,那么我们可以使用 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.使用比较器检查排序数组

如果数组项没有实现 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 类,以避免重写这个简单的逻辑。

快乐学习!!

标签2: Java Array
地址:https://www.cundage.com/article/check-sorted-array.html

相关阅读

使用 array clone、System.arrayCopy() 和 Arrays.copyOf() 方法将一个数组复制到另一个数组对象的 Java 示例。 请注意,下面给出的所有方法都会创建...
从数组创建子数组的 Java 示例,即创建数组切片。学习使用 Java 8 Arrays.copyOfRange() 方法,以及将 子数组转换为 List 对象。 String[] names ...
通过示例学习在 Java 中创建数组的深拷贝。我们将使用 Apache Commons Lang 库及其实用方法 SerializationUtils.clone( array ) 到 arra...
学习使用 HashSet 类。交集是属于两个不同集合的一组共同项目。 路口 要获取两个数组的交集,请按照下列步骤操作: 将第一个数组推送到 HashSet 实例中。 使用retainAll()方...
学习检查数组是否包含元素。另外,学习查找数组中元素的索引。 2. 使用数组类 要检查元素是否在数组中,我们可以使用 Arrays类将数组转换为 ArrayList 并使用 contains() ...
学习使用不同的方法在 Java 中拆分数组。我们将学习将数组分成相等的部分,在指定的索引处和相等的长度。 1. Arrays.copyOfRange() API copyOfRange() 创建...
Learn to 将 byte[] 数组转换为字符串 and 将 String 转换为 byte[] 数组 in Java with examples. Conversion between b...
学习使用不同的技术及其差异来声明和初始化数组。除了直接访问数组外,我们还将使用 java.util.Arrays 和 Stream API,它们提供了几种在 Java 中处理数组的有用方法。 请...
数组是固定大小的数据结构,数组大小一旦初始化就不能更改。但是,在需要更改数组大小的情况下,我们必须遵循本教程中给出的方法之一。 1. 使用 java.util.Arrays.copyOf() c...
学习从数组中查找、计算和删除所有重复元素 在 Java 中使用 Streams、地图和设置 来自集合框架。 我们将使用以下 Integer 值数组。其他数据类型的逻辑也是一样的。 1. 使用 S...