Фильтрация ArrayList
Проблема с фильтрацией элементов в ArrayList на Java
Я пытаюсь отфильтровать элементы из ArrayList
в Java. У меня есть следующий список:
- How are you
- How you doing
- Joe
- Mike
Я хочу применить фильтр по слову "How", чтобы убрать элементы "Joe" и "Mike". Как мне это реализовать?
Я видел, что на данный вопрос уже есть ответы, но все они были даны 9 лет назад, и я не уверен, что они актуальны. Если кто-то может помочь с простым и понятным примером решения данной задачи, буду очень благодарен.
2 ответ(ов)
Вам необходимо пройтись по списку и проверить, содержит ли он вашу строку "How". Если она найдена, то нужно удалить её. Вы можете использовать следующий код:
// нужно создать новый ArrayList, иначе операция удаления не будет поддерживаться
List<String> list = new ArrayList<String>(Arrays.asList(new String[]
{"How are you?", "How you doing?","Joe", "Mike"}));
System.out.println("Список до: " + list);
for (Iterator<String> it = list.iterator(); it.hasNext();) {
if (!it.next().contains("How"))
it.remove(); // ЗАМЕТКА: используется метод remove итератора, а не ArrayList
}
System.out.println("Список после: " + list);
РЕЗУЛЬТАТ:
Список до: [How are you?, How you doing?, Joe, Mike]
Список после: [How are you?, How you doing?]
Обратите внимание, что для удаления элементов во время итерации необходимо использовать метод remove()
итератора, иначе вы столкнетесь с исключением ConcurrentModificationException
.
Ваш вопрос касается реализации функции фильтрации с использованием Java. Приведенный вами код действительно показывает, как создать фильтрующую функцию, используя Predicate
и стримы, начиная с JDK 1.8. Вот пример вашей функции с пояснением:
public <T> List<T> filter(Predicate<T> criteria, List<T> list) {
return list.stream().filter(criteria).collect(Collectors.toList());
}
В этом коде функция filter
принимает два параметра: предикат criteria
, который содержит условие фильтрации, и список list
, который вы хотите отфильтровать. Используя стримы, мы применяем предикат к элементам списка и возвращаем новый список, содержащий только те элементы, которые удовлетворяют условию.
Для использования этой функции вы можете сделать следующее:
list = new Test().filter(x -> x > 2, list);
В этом случае мы фильтруем список, возвращая только те элементы, которые больше 2. Такой подход действительно является одним из наиболее «аккуратных» способов записи фильтров в Java, однако стоит отметить, что для этого требуется как минимум JDK 1.8, так как именно в этой версии были введены лямбда-выражения и стримы.
Если у вас есть вопросы по реализации или дополнительные нюансы, не стесняйтесь обращаться за помощью!
Инициализация ArrayList в одну строчку
Преобразование 'ArrayList<String>' в 'String[]' в Java
Java 8: Уникальные элементы по свойству (Distinct by property)
Как преобразовать список списков в список в Java 8?
Как удалить повторяющиеся элементы из ArrayList?