Javaで配列がソートされているかどうかを確認する

1. 概要

このチュートリアルでは、配列がソートされているかどうかを確認するさまざまな方法を紹介します。
ただし、開始する前に、https://www.baeldung.com/java-sorting-arrays [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. _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_オブジェクトを使用します。 これは、3つのフィールドを持つ単純な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. 再帰的に

もちろん、代わりにlink:/java-recursion[recursion]を使用できます。 ここでの考え方は、配列内の2つの位置をチェックし、すべての位置をチェックするまで再帰することです。

3.1. プリミティブ配列

この方法では、*最後の2つの位置を確認します。 それらがソートされている場合、前の位置でメソッドを再度呼び出します。*これらの位置のいずれかがソートされていない場合、メソッドは_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. _Comparable_を実装するオブジェクト

それでは、__ 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. _Comparable_を実装しないオブジェクト

最後に、__Comparator ___parameterを追加して、_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. 結論

このチュートリアルでは、配列がソートされているかどうかを確認する方法を見てきました。 反復解法と再帰解法の両方を見ました。
*推奨されるのはループソリューションを使用することです。 よりクリーンで読みやすくなっています。*
いつものように、このチュートリアルのソースコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-arrays[GitHub上]にあります。