行业资讯 2025年08月6日
0 收藏 0 点赞 947 浏览 2510 个字
摘要 :

文章目录 1. 概述 2. 检查排序数组 2.1. 基础数据类型数组 2.2. 用于 Comparable 对象的检查已排序的数组 2.3. 使用 Comparator 检查已排序的数组 3. Apache Commons ……




  • 1. 概述
  • 2. 检查排序数组
    • 2.1. 基础数据类型数组
    • 2.2. 用于 Comparable 对象的检查已排序的数组
    • 2.3. 使用 Comparator 检查已排序的数组
  • 3. Apache Commons 的 ArrayUtils
  • 4. 结论

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

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.zuozi.net/9299.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号