如何确定列表是否在Java中排序?流

2022-08-31 12:11:53

我想要一个方法,它采用 where 实现和返回,或者取决于列表是否排序。List<T>TComparabletruefalse

在Java中实现它的最佳方法是什么?很明显,泛型和通配符意味着能够轻松处理这些事情,但我都被纠缠在一起了。

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


答案 1

Guava通过其比较器类提供此功能。

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

还有排序类,尽管这基本上已经过时了。An 是 ++。在这种情况下,如果您有实现 的某种类型的列表,则可以编写:OrderingComparatorComparable

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

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

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

另外,由于您提到您希望能够检查反向顺序和正常顺序,因此可以按如下方式完成:

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

答案 2

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

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

更簡單地說,在Java 16+中,使用Stream#toList

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

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

请注意,与其他方法相比,此方法的空间和时间复杂性更差,因为它必须对列表进行排序,因此不应将其用于非常大的列表。但它是最容易使用的,因为它是单个表达式,不涉及第三方库。


推荐