Java 如何判断一个List 是否排序?

新手上路,请多包涵

I would like a method that takes a List<T> where T implements Comparable and returns true or false depending on列表是否排序。

在 Java 中实现它的最佳方法是什么?很明显,泛型和通配符是为了能够轻松处理这些事情,但我越来越纠结了。

如果有一个类似的方法来检查列表是否以相反的顺序排列,那也很好。

原文由 Eric Wilson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

Guava 通过其 Comparators 类提供此功能。

 boolean sorted = Comparators.isInOrder(list, comparator);


还有 Ordering 类,尽管这大多已过时。一个 Ordering 是一个 Comparator ++。在这种情况下,如果您有实现 Comparable 的某种类型的列表,您可以这样写:

 boolean sorted = Ordering.natural().isOrdered(list);

这适用于任何 Iterable ,而不仅仅是 List ,您可以轻松处理 null 通过指定它们是否应该在任何其他非 null 之前或之后出现 --- 元素:

 Ordering.natural().nullsLast().isOrdered(list);

此外,由于您提到您希望能够检查反向订单以及正常情况,因此可以这样做:

 Ordering.natural().reverse().isOrdered(list);

原文由 ColinD 发布,翻译遵循 CC BY-SA 4.0 许可协议

溪流

如果您使用的是 Java 8 或更高版本, 可能会有所帮助。

 list.stream().sorted().collect(Collectors.toList()).equals(list);

更简单地说,在 Java 16 + 中,使用 Stream#toList

 list.stream().sorted().toList().equals(list);

此代码会将列表排序,并将其元素收集到另一个列表中,然后将其与初始列表进行比较。如果两个列表在相同的位置包含相同的元素,则比较将成功。

请注意,此方法的空间和时间复杂度比其他方法更差,因为它必须将列表排序错位,因此不应用于非常大的列表。但它是最容易使用的,因为它是一个单一的表达式,不涉及 3rd 方库。

原文由 Palle 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏