1. 概要

このチュートリアルでは、ArrayListで文字列を検索するさまざまな方法を調べます。 私たちの目的は、 ArrayList の要素のいずれかに特定の空でない文字シーケンスが存在するかどうかを確認し、一致するすべての要素を含むリストを返すことです。

2. 基本的なループ

まず、基本的なループを使用して、JavaのStringクラスのcontainsメソッドを使用して、指定された検索文字列内の文字のシーケンスを検索しましょう。

public List<String> findUsingLoop(String search, List<String> list) {
    List<String> matches = new ArrayList<String>();

    for(String str: list) {
        if (str.contains(search)) {
            matches.add(str);
        }
    }

    return matches;
}

3. ストリーム

Java 8 Streams API は、機能操作を使用することにより、よりコンパクトなソリューションを提供します。

まず、 filter()メソッドを使用して入力リストで検索文字列を検索し、次に collect メソッドを使用して、一致する要素:

public List<String> findUsingStream(String search, List<String> list) {
    List<String> matchingElements = list.stream()
      .filter(str -> str.trim().contains(search))
      .collect(Collectors.toList());

    return matchingElements;
}

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

Java 8 Stream APIを使用できない場合は、CommonsCollectionsやGoogleGuavaなどのサードパーティライブラリを調べることができます。

それらを使用するには、pom.xmlファイルに Guava Commons Collections 、または両方の依存関係を追加する必要があります。

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.1</version>
</dependency>

4.1. CommonsCollections

Commons Collectionsは、指定された IterablePredicateと照合するメソッドIterableUtils.filteredIterable()を提供します。

IterableUtils.filteredIterable()を呼び出して、検索文字列を含む要素のみを選択する述語を定義しましょう。 次に、 IteratorUtils.toList()を使用して、IterableListに変換します。

public List<String> findUsingCommonsCollection(String search, List<String> list) {
    Iterable<String> result = IterableUtils.filteredIterable(list, new Predicate<String>() {
        public boolean evaluate(String listElement) {
            return listElement.contains(search);
        }
    });

    return IteratorUtils.toList(result.iterator());
}

4.2. Google Guava

Google Guavaは、 Iterables.filter()メソッドを使用して、Apacheの filteredIterable()と同様のソリューションを提供します。 これを使用してリストをフィルタリングし、検索文字列に一致する要素のみを返します。

public List<String> findUsingGuava(String search, List<String> list) {         
    Iterable<String> result = Iterables.filter(list, Predicates.containsPattern(search));

    return Lists.newArrayList(result.iterator());
}

5. 結論

このチュートリアルでは、さまざまな検索方法を学びました。配列リスト。 私たちは最初に単純なものから始めました為にループしてから、StreamAPIを使用したアプローチを続行します。 最後に、GoogleGuavaとCommonsCollectionsの2つのサードパーティライブラリを使用した例をいくつか見てきました。

完全な例は、GitHubから入手できます。