Перейти к основному содержимому

Поиск строки в ArrayList

· 2 мин. чтения

1. Обзор

В этом руководстве мы рассмотрим различные способы поиска строки в списке ArrayList . Наша цель — проверить, присутствует ли определенная непустая последовательность символов в каком-либо из элементов в ArrayList , и вернуть список со всеми соответствующими элементами.

2. Базовый цикл

Во-первых, давайте воспользуемся базовым циклом для поиска последовательности символов в заданной строке поиска, используя метод contains класса String Java :

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, мы можем обратиться к сторонним библиотекам, таким как Commons Collections и Google Guava.

Чтобы использовать их, нам просто нужно добавить Guava , Commons Collections или обе зависимости в наш файл pom.xml:

<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. Коллекции Викисклада

Коллекции Commons предоставляют нам метод IterableUtils.filteredIterable() , который сопоставляет данный Iterable с Predicate .

Давайте вызовем IterableUtils.filteredIterable() , определив предикат для выбора только тех элементов, которые содержат строку поиска. Затем мы будем использовать IteratorUtils.toList() для преобразования Iterable в List :

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 Гуава

Google Guava предлагает аналогичное решение Apache filteredIterable() с методом Iterables.filter() . Давайте используем его для фильтрации списка и возврата только элементов, соответствующих нашей строке поиска:

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

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

5. Вывод

В этом руководстве мы узнали о различных способах поиска строки в ArrayList. Сначала мы начали с простого цикла for , а затем перешли к подходу с использованием Stream API. Наконец, мы увидели несколько примеров с использованием двух сторонних библиотек — Google Guava и Commons Collections .

Полные примеры доступны на GitHub .