配列がJavaでソートされているかどうかの確認
1. 概要
このチュートリアルでは、配列がソートされているかどうかを確認するさまざまな方法を紹介します。
ただし、始める前に、Javaで配列をソートする方法を確認するのは興味深いことです。
2. ループ付き
確認する1つの方法は、forループを使用することです。 配列のすべての値を1つずつ繰り返すことができます。
それを行う方法を見てみましょう。
2.1. プリミティブ配列
簡単に言えば、最後の位置を除くすべての位置を繰り返し処理します。 これは、ある位置を次の位置と比較するためです。
それらのいくつかがソートされていない場合、メソッドはfalseを返します。比較のいずれも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. Compareableを実装するオブジェクト
Compareableを実装するオブジェクトでも同様のことができます。大なり記号を使用する代わりに、 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. 比較可能を実装しないオブジェクト
しかし、オブジェクトが Compareable を実装していない場合はどうなりますか? この場合、代わりにコンパレータを作成できます。
この例では、Employeeオブジェクトを使用します。 これは、3つのフィールドを持つ単純なPOJOです。
public class Employee implements Serializable {
private int id;
private String name;
private int age;
// getters and setters
}
次に、注文するフィールドを選択する必要があります。 ここで、年齢フィールドで並べ替えましょう。
Comparator<Employee> byAge = Comparator.comparingInt(Employee::getAge);
次に、コンパレータも使用するようにメソッドを変更できます。
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. 再帰的に
もちろん、代わりにrecursionを使用することもできます。 ここでの考え方は、配列内の2つの位置をチェックしてから、すべての位置をチェックするまで繰り返します。
3.1. プリミティブ配列
この方法では、
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. Compareableを実装するオブジェクト
さて、実装するオブジェクトとしてもう一度見てみましょう
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. 比較可能を実装しないオブジェクト
最近、 Employee オブジェクトを再試行して、コンパレータパラメーターを追加します。
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のにあります。