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

1. 概要

このチュートリアルでは、リストがJavaでソートされているかどうかを確認する*さまざまな方法を紹介します。

2. 反復アプローチ

反復アプローチは、ソートされたリストを確認するためのシンプルで直感的な方法です。 このアプローチでは、リストを繰り返して、隣接する要素を比較します。 隣接する2つの要素のいずれかがソートされていない場合、リストはソートされていないと言えます。
リストは、自然な順序またはカスタムの順序で並べ替えることができます。 _Comparable_および_Comparator_インターフェースを使用して、これらの両方のケースをカバーします。

* 2.1。 Comparable *の使用

まず、要素が_Comparable_ *型であるリストの例を見てみましょう。 ここでは、_String_型のオブジェクトを含むリストを検討します。
public static boolean isSorted(List<String> listOfStrings) {
    if (isEmpty(listOfStrings) || listOfStrings.size() == 1) {
        return true;
    }

    Iterator<String> iter = listOfStrings.iterator();
    String current, previous = iter.next();
    while (iter.hasNext()) {
        current = iter.next();
        if (previous.compareTo(current) > 0) {
            return false;
        }
        previous = current;
    }
    return true;
}

* 2.2。 Comparator *の使用

それでは、_Comparable_を実装しない_Employee_クラスを考えてみましょう。 したがって、この場合、_Comparator_を使用して、リストの隣接する要素を比較する必要があります。
public static boolean isSorted(List<Employee> employees, Comparator<Employee> employeeComparator) {
    if (isEmpty(employees) || employees.size() == 1) {
        return true;
    }

    Iterator<Employee> iter = employees.iterator();
    Employee current, previous = iter.next();
    while (iter.hasNext()) {
        current = iter.next();
        if (employeeComparator.compare(previous, current) > 0) {
            return false;
        }
        previous = current;
    }
    return true;
}
上記の2つの例は似ています。 唯一の違いは、リストの前の要素と現在の要素を比較する方法です。
さらに、* Comparator_を使用して、並べ替えチェックを正確に制御することもできます*。 これら2つの詳細については、https://www.baeldung.com/java-comparator-comparable [Comparator and Comparable in Java]チュートリアルをご覧ください。

3. 再帰的アプローチ

次に、再帰を使用してソート済みリストを確認する方法を確認します。
public static boolean isSorted(List<String> listOfStrings) {
    return isSorted(listOfStrings, listOfStrings.size());
}

public static boolean isSorted(List<String> listOfStrings, int index) {
    if (index < 2) {
        return true;
    } else if (listOfStrings.get(index - 2).compareTo(listOfStrings.get(index - 1)) > 0) {
        return false;
    } else {
        return isSorted(listOfStrings, index - 1);
    }
}

4. グアバの使用

多くの場合、独自のロジックを記述する代わりに、サードパーティのライブラリを使用することをお勧めします。 Guavaライブラリには、リストがソートされているかどうかを確認するために使用できるユーティリティクラスがいくつかあります。

* 4.1。 グアバ_注文_クラス*

このセクションでは、グアバの_Ordering_クラスを使用して、ソートされたリストを確認する方法を説明します。
最初に、_Comparable_型の要素を含むリストの例を確認します。
public static boolean isSorted(List<String> listOfStrings) {
    return Ordering.<String> natural().isOrdered(listOfStrings);
}
次に、_Comparator_を使用して_Employee_オブジェクトのリストがソートされているかどうかを確認する方法を確認します。
public static boolean isSorted(List<Employee> employees, Comparator<Employee> employeeComparator) {
    return Ordering.from(employeeComparator).isOrdered(employees);
}
また、_natural()。reverseOrder()_を使用して、リストが逆順でソートされているかどうかを確認できます。 さらに、_natural()。nullFirst()_および_natural()_._ nullLast()_を使用して、_null_がソートされたリストの最初または最後に表示されるかどうかを確認できます。
Guava _Ordering_クラスの詳細については、https://www.baeldung.com/guava-ordering [Guavaの注文ガイド]の記事を参照してください。

* 4.2。 グアバ_コンパレーター_クラス*

Java 8以上を使用している場合、グアバは_Comparators_クラスに関してより優れた代替手段を提供します。 このクラスの* isInOrder_メソッドを使用する*の例を見てみましょう。
public static boolean isSorted(List<String> listOfStrings) {
    return Comparators.isInOrder(listOfStrings, Comparator.<String> naturalOrder());
}
ご覧のとおり、上記の例では、自然順序付けを使用して、ソートされたリストを確認しました。 _Comparator_を使用して、並べ替えチェックをカスタマイズすることもできます。

5. 結論

この記事では、単純な反復アプローチ、再帰アプローチ、およびGuavaを使用して、ソートされたリストを確認する方法を説明しました。 また、並べ替えチェックロジックを決定する際の_Comparator_および_Comparable_の使用法についても簡単に触れました。
これらのすべての例とコードスニペットの実装は、https://github.com/eugenp/tutorials/tree/master/algorithms-miscellaneous-3 [over on GitHub]にあります。