1. 概述

在 Java 编程中,判断一个列表是否已经排序是一个常见需求,尤其在数据校验、算法优化等场景中。本文将介绍几种简单实用的方法来实现这一判断,包括:

  • 基于循环的判断方法
  • 使用递归
  • 使用 Guava 工具库

这些方法各有优劣,可以根据项目实际情况选择使用。


2. 循环判断法(Iterative Approach)

这是最直观、最常用的方式。通过遍历列表,逐个比较相邻元素的大小,一旦发现不符合排序规则的,立即返回 false。

2.1 使用 Comparable

适用于列表元素本身实现了 Comparable 接口的情况,例如 StringInteger 等。

示例代码如下:

public static boolean isSorted(List<String> listOfStrings) {
    if (isEmpty(listOfStrings) || listOfStrings.size() == 1) {
        return true;
    }

    Iterator<String> iter = listOfStrings.iterator();
    String current, previous = iter.next();
    while (iter.hasNext()) {
        current = iter.next();
        if (previous.compareTo(current) > 0) {
            return false;
        }
        previous = current;
    }
    return true;
}

✅ 优点:逻辑清晰,效率高
❌ 缺点:需要手动处理边界条件和比较逻辑

2.2 使用 Comparator

当列表元素未实现 Comparable 接口时(如自定义类),可以通过传入一个 Comparator 来进行比较。

例如我们有一个 Employee 类:

public static boolean isSorted(List<Employee> employees, Comparator<Employee> employeeComparator) {
    if (isEmpty(employees) || employees.size() == 1) {
        return true;
    }

    Iterator<Employee> iter = employees.iterator();
    Employee current, previous = iter.next();
    while (iter.hasNext()) {
        current = iter.next();
        if (employeeComparator.compare(previous, current) > 0) {
            return false;
        }
        previous = current;
    }
    return true;
}

⚠️ 注意:使用 Comparator 可以更灵活地控制排序规则,比如根据姓名、年龄等字段排序。


3. 递归判断法(Recursive Approach)

虽然不如循环直观,但也可以用递归来实现。该方法适合理解递归思想,但在实际项目中并不推荐,尤其在列表较长时容易导致栈溢出。

示例代码如下:

public static boolean isSorted(List<String> listOfStrings) {
    return isSorted(listOfStrings, listOfStrings.size());
}

public static boolean isSorted(List<String> listOfStrings, int index) {
    if (index < 2) {
        return true;
    } else if (listOfStrings.get(index - 2).compareTo(listOfStrings.get(index - 1)) > 0) {
        return false;
    } else {
        return isSorted(listOfStrings, index - 1);
    }
}

✅ 优点:代码简洁
❌ 缺点:可读性差、性能低、易栈溢出


4. 使用 Guava 工具库

如果你的项目中已经引入了 Google Guava,可以借助其内置工具类更简洁地实现此功能。

4.1 使用 Ordering

Guava 的 Ordering 类提供了 isOrdered() 方法,用于判断列表是否有序。

示例代码如下:

public static boolean isSorted(List<String> listOfStrings) {
    return Ordering.<String>natural().isOrdered(listOfStrings);
}

如果是自定义对象,则可以配合 Comparator 使用:

public static boolean isSorted(List<Employee> employees, Comparator<Employee> employeeComparator) {
    return Ordering.from(employeeComparator).isOrdered(employees);
}

此外,Ordering 还支持逆序、null 排序等高级功能:

  • natural().reverseOrder():判断是否逆序
  • natural().nullFirst():null 值在最前
  • natural().nullLast():null 值在最后

4.2 使用 Comparators

Guava 的 Comparators 类提供了 isInOrder() 方法,适用于 Java 8+ 项目:

public static boolean isSorted(List<String> listOfStrings) {
    return Comparators.isInOrder(listOfStrings, Comparator.<String>naturalOrder());
}

✅ 优点:代码简洁、可读性强
❌ 缺点:依赖 Guava,不适合轻量级项目


5. 总结

方法 适用场景 是否推荐
循环判断 所有项目 ✅ 强烈推荐
递归判断 教学演示 ❌ 不推荐
Guava Ordering 已引入 Guava 的项目 ✅ 推荐
Guava Comparators Java 8+ 项目 ✅ 推荐

在实际开发中,推荐优先使用循环判断法,因为其逻辑清晰、性能稳定、无需依赖第三方库。若项目中已使用 Guava,也可以直接调用其工具类简化代码。

完整代码示例已上传至 GitHub,可参考:https://github.com/eugenp/tutorials(路径:algorithms-modules/algorithms-miscellaneous-3


原始标题:Checking If a List Is Sorted in Java | Baeldung