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. プリミティブ配列

この方法では、 最後の2つの位置を確認します。 並べ替えられている場合は、前の位置でメソッドを再度呼び出します。 これらの位置の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を実装するオブジェクト

さて、実装するオブジェクトとしてもう一度見てみましょう同程度の。 同じアプローチで 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. 比較可能を実装しないオブジェクト

最近、 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にあります。