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 .