1. 概述
在本篇文章中,我们会学习用不同的方式来检查Java
数组中的元素是否有序。
在开始学习之前,你需要了解一下在Java中如何对数组排序
2.使用循环
使用for
循环可以来检查Java
数组中的元素是否有序。我们可以通过迭代比较数组中的所有元素,两两比较。
2.1 基本数据类型的数组
我们会通过索引迭代数组元素中的所有元素,将第一个和第二个比较,第二个和第三个比较,以此类推,直到最后一个元素比较终结。
如果有其中一组比较返回false
,则数组不是有序的;否则,数组就是有序的。
boolean isSorted(int[] array) {
for (int i = 0; i < array.length - 1; i++) {
if (array[i] > array[i + 1])
return false;
}
return true;
}
2.2 引用类型的数组实现了Comparable接口
我们可以使用实现Comparable
的对象做类似的事情。
我们将使用compareTo
方法而不是使用大于号的符号做比较:
boolean isSorted(Comparable[] array) {
for (int i = 0; i < array.length - 1; ++i) {
if (array[i].compareTo(array[i + 1]) > 0)
return false;
}
return true;
}
2.3 引用类型的数组实现了Comparable接口
如果一个引用类型没有实现Comparable
接口,那么我们就需要创建一个Comparator
。
在这个例子中,我们会使用Employee
对象,是一个简单的POJO
对象,存在三个属性。
public class Employee implements Serializable {
private int id;
private String name;
private int age;
// getters and setters
}
接着,我们需要选择按照哪个属性进行排序。假设我们按照age
进行排序:
Comparator<Employee> byAge = Comparator.comparingInt(Employee::getAge);
然后,我们可以改变我们的方法也采用Comparator
:
boolean isSorted(Object[] array, Comparator comparator) {
for (int i = 0; i < array.length - 1; ++i) {
if (comparator.compare(array[i], (array[i + 1])) > 0)
return false;
}
return true;
}
3. 递归
当然,我们可以使用递归来代替循环。这里的想法是我们将检查数组中的两个位置然后递归,直到我们检查每个位置。
3.1 基本数据类型数组
在这种方法中,我们检查最后两个位置的元素。
如果它们已经排序,我们将再次调用该方法,但具有先前的位置。
如果其中一个位置未排序,则该方法将返回false
:
boolean isSorted(int[] array, int length) {
if (array == null || length < 2)
return true;
if (array[length - 2] > array[length - 1])
return false;
return isSorted(array, length - 1);
}
3.2 引用类型实现了Comparator接口
现在,让我们再看一下实现Comparable
的对象。
我们将看到compareTo
采用相同的方法:
boolean isSorted(Comparable[] array, int length) {
if (array == null || length < 2)
return true;
if (array[length - 2].compareTo(array[length - 1]) > 0)
return false;
return isSorted(array, length - 1);
}
3.3 引用类型没有实现Comparator接口
boolean isSorted(Object[] array, Comparator comparator, int length) {
if (array == null || length < 2)
return true;
if (comparator.compare(array[length - 2], array[length - 1]) > 0)
return false;
return isSorted(array, comparator, length - 1);
}
4. 结论
在本教程中,我们已经了解了如何检查数组是否已排序。
我们看到了迭代和递归解决方案。
我们的建议是使用循环解决方案。
它更干净,更容易阅读。
像往常一样,本教程的源代码可以在GitHub上找到。
原文地址:https://www.baeldung.com/java-check-sorted-array
作者:Eugen
译者:lee