Javaリスト内のすべての要素が同じかどうかを判別

1. 概要

このクイックチュートリアルでは、_List_のすべての要素が同じであるかどうかを判断する方法について説明します。
また、Big O表記を使用して各ソリューションの時間の複雑さを調べ、最悪のシナリオを示します。

2. 例

次の3つのリストがあるとします。
notAllEqualList = Arrays.asList("Jack", "James", "Sam", "James");
emptyList = Arrays.asList();
allEqualList = Arrays.asList("Jack", "Jack", "Jack", "Jack");
私たちのタスクは、_emptyList_および_allEqualList_に対してのみ_true_を返すさまざまなソリューションを提案することです。

3. 基本的なループ

まず、すべての要素が等しくなるためには、それらすべてが最初の要素と等しくなければならないのは事実です。 ループでそれを活用しましょう:
public boolean verifyAllEqualUsingALoop(List<String> list) {
    for (String s : list) {
        if (!s.equals(list.get(0)))
            return false;
    }
    return true;
}
時間の複雑さは_O(n)_ですが、しばしば早く終了する可能性があるため、これは便利です。

4. HashSet

また、https://www.baeldung.com/java-hashset [_HashSet_]を使用することもできます。その要素はすべて異なるためです。 **リスト_を_HashSet_に変換し、結果のサイズが1以下の場合、リスト内のすべての要素が等しいことがわかります:**
public boolean verifyAllEqualUsingHashSet(List<String> list) {
    return new HashSet<String>(list).size() <= 1;
}
link:/java-collections-complexity[_List_ to _HashSet_ cost _O(n)_] timeの変換中にlink:/java-collections-complexity[calling _size_は_Oを取る(1)_]。 したがって、_O(n)_という合計時間の複雑さはまだあります。

5. Collections API

別の解決策は、https://www.baeldung.com/java-collections [Collections API]の_frequency(Collection c、Object o)_メソッドを使用することです。 *このメソッドは、an_Object o_ *に一致する_Collection c_内の要素の数を返します。
したがって、頻度の結果がリストのサイズに等しい場合、すべての要素が等しいことがわかります。
public boolean verifyAllEqualUsingFrequency(List<String> list) {
    return list.isEmpty() || Collections.frequency(list, list.get(0)) == list.size();
}
以前のソリューションと同様に、内部的には_Collections.frequency()_が基本的なループを使用するため、時間の複雑さは_O(n)_です。

6. ストリーム

link:/java-8-streams[Java 8の_Stream_ API]は、リスト内のすべてのアイテムが等しいかどうかを検出するための、さらに別の方法を提供します。

6.1. distinct()

__distinct()__methodを使用する特定のソリューションを見てみましょう。
リスト内のすべての要素が等しいかどうかを確認するために、*ストリームの個別の要素をカウントします*
public boolean verifyAllEqualUsingStream(List<String> list) {
    return list.stream()
      .distinct()
      .count() <= 1;
}
このストリームのカウントが1以下の場合、すべての要素は等しく、_true_を返します。
操作の総コストは_O(n)、_です。これは、すべてのストリーム要素を通過するのにかかる時間です。

6.2. allMatch()

_Stream_ APIの_allMatch()_メソッドは、このストリームのすべての要素が提供された述語と一致するかどうかを判断するための完璧なソリューションを提供します。
public boolean verifyAllEqualAnotherUsingStream(List<String> list) {
    return list.isEmpty() || list.stream()
      .allMatch(list.get(0)::equals);
}
ストリームを使用した前の例と同様に、これには_O(n)_時間の複雑さがあります。これは、ストリーム全体をトラバースする時間です。

7. サードパーティのライブラリ

以前のバージョンのJavaにこだわっており、Stream APIを使用できない場合は、* Google _Guava_や_Apache Commons_などのサードパーティライブラリを使用できます。*
ここには、非常によく似た2つのソリューションがあり、要素のリストを反復処理し、それを最初の要素と照合します。 したがって、時間の複雑さを簡単に計算して_O(n)_にできます。

7.1. Mavenの依存関係

どちらかを使用するには、https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22com.google.guava%22%20a%3A%22guava%22[_guava_]またはhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22commons-collections4%22%20g%3A%22org.apache.commons%22[_commons-collections4_]それぞれプロジェクト:
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>23.0</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.1</version>
</dependency>

7.2. Google Guava

link:/guava-filter-and-transform-a-collection[_Google Guava_では、静的メソッド_Iterables.all()_]は、リスト内のすべての要素が述語を満たす場合、_true_を返します。
public boolean verifyAllEqualUsingGuava(List<String> list) {
    return Iterables.all(list, new Predicate<String>() {
        public boolean apply(String s) {
            return s.equals(list.get(0));
        }
    });
}

7.3. Apache Commons

同様に、_Apache Commons_ライブラリは、静的ユーティリティメソッドのセットを持つユーティリティクラスutilityhttps://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/IterableUtils.html [_IterableUtils_]も提供します。 _Iterable_インスタンスを操作します。
特に、静的メソッド_IterableUtils.matchesAll()_は、リスト内のすべての要素が述語を満たす場合、_true_を返します。
public boolean verifyAllEqualUsingApacheCommon(List<String> list) {
    return IterableUtils.matchesAll(list, new org.apache.commons.collections4.Predicate<String>() {
        public boolean evaluate(String s) {
            return s.equals(list.get(0));
        }
    });
}

8. 結論

この記事では、a__List_のすべての要素が等しいかどうかを確認するさまざまな方法を学びました。単純なJava機能から始めて、_Stream_ APIとサードパーティライブラリ_Google Guava_ and _Apache Commonsを使用して別の方法を示しました。
また、各ソリューションが_O(n)_の同じ時間の複雑さを与えることも学びました。 ただし、使用方法や使用場所に応じて最適なものを選択するのは私たちの責任です。
そして、サンプルの完全なセットを必ずチェックしてくださいhttps://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-collections-list-3[GitHubで]。