Java中检查数组是否已排序

培训教学 潘老师 8个月前 (09-23) 173 ℃ (0) 扫码查看

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

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


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/teach/9232.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】