0

Фильтрация ArrayList

12

Проблема с фильтрацией элементов в ArrayList на Java

Я пытаюсь отфильтровать элементы из ArrayList в Java. У меня есть следующий список:

  1. How are you
  2. How you doing
  3. Joe
  4. Mike

Я хочу применить фильтр по слову "How", чтобы убрать элементы "Joe" и "Mike". Как мне это реализовать?

Я видел, что на данный вопрос уже есть ответы, но все они были даны 9 лет назад, и я не уверен, что они актуальны. Если кто-то может помочь с простым и понятным примером решения данной задачи, буду очень благодарен.

2 ответ(ов)

0

Вам необходимо пройтись по списку и проверить, содержит ли он вашу строку "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.

0

Ваш вопрос касается реализации функции фильтрации с использованием 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, так как именно в этой версии были введены лямбда-выражения и стримы.

Если у вас есть вопросы по реализации или дополнительные нюансы, не стесняйтесь обращаться за помощью!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь