1. 概要

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

2. 反復アプローチ

反復アプローチは、ソートされたリストをチェックするためのシンプルで直感的な方法です。 このアプローチでは、リストを繰り返し、隣接する要素を比較します。 隣接する2つの要素のいずれかがソートされていない場合、リストはソートされていないと言えます。

リストは、自然な順序またはカスタムの順序で並べ替えることができます。 CompareableおよびComparatorインターフェースを使用して、これらの両方のケースについて説明します。

2.1. Compareableを使用する

まず、要素が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. コンパレータを使用する

ここで、Compareableを実装していないEmployeeクラスについて考えてみましょう。 したがって、この場合、コンパレータを使用して、リストの隣接する要素を比較する必要があります。

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つの例は似ています。 唯一の違いは、リストの以前の要素と現在の要素を比較する方法にあります。

さらに、コンパレータを使用してソートチェックを正確に制御することもできます。 これら2つの詳細については、ComparatorおよびComparableinJavaチュートリアルを参照してください。

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. グアバ注文クラス

このセクションでは、Guavaの Ordering クラスを使用して、並べ替えられたリストを確認する方法を説明します。

最初に、タイプCompareableの要素を含むリストの例を示します。

public static boolean isSorted(List<String> listOfStrings) {
    return Ordering.<String> natural().isOrdered(listOfStrings);
}

次に、EmployeeオブジェクトのリストがComparatorを使用して並べ替えられているかどうかを確認する方法を確認します。

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 クラスの詳細については、 Guava’sOrderingの記事を参照してください。

4.2. グアバコンパレータクラス

Java 8以降を使用している場合、Guavaはコンパレータクラスの点でより優れた代替手段を提供します。 このクラスのisInOrderメソッドを使用したの例を示します。

public static boolean isSorted(List<String> listOfStrings) {
    return Comparators.isInOrder(listOfStrings, Comparator.<String> naturalOrder());
}

ご覧のとおり、上記の例では、並べ替えられたリストをチェックするために自然な順序を使用しています。 コンパレータを使用して、ソートチェックをカスタマイズすることもできます。

5. 結論

この記事では、単純な反復アプローチ、再帰的アプローチ、およびGuavaを使用して、並べ替えられたリストを確認する方法を説明しました。 また、ソートチェックロジックを決定する際のコンパレータ比較可能の使用法についても簡単に触れました。

これらすべての例とコードスニペットの実装は、GitHubにあります。