Фильтр ArrayList

Как вы можете отфильтровать что-то из Java ArrayList, как если бы вы:

  • Как вы
  • Как вы делаете
  • Joe
  • Mike

И фильтр "Как" он удалит Джо и Майка.

Ответ 1

Вероятно, лучший способ - использовать Guava

List<String> list = new ArrayList<String>();
list.add("How are you");
list.add("How you doing");
list.add("Joe");
list.add("Mike");

Collection<String> filtered = Collections2.filter(list,
    Predicates.containsPattern("How"));
print(filtered);

печатает

How are you
How you doing

Если вы хотите получить отфильтрованную коллекцию в виде списка, вы можете использовать ее (также из Guava):

List<String> filteredList = Lists.newArrayList(Collections2.filter(
    list, Predicates.containsPattern("How")));

Ответ 2

В , они ввели метод removeIf, который принимает Predicate в качестве параметра.

Так будет легко:

List<String> list = new ArrayList<>(Arrays.asList("How are you",
                                                  "How you doing",
                                                  "Joe",
                                                  "Mike"));
list.removeIf(s -> !s.contains("How"));

Ответ 3

Перейдите в список и проверьте, содержит ли строка "Как", и удаляет ли она. Вы можете использовать следующий код:

// need to construct a new ArrayList otherwise remove operation will not be supported
List<String> list = new ArrayList<String>(Arrays.asList(new String[] 
                                  {"How are you?", "How you doing?","Joe", "Mike"}));
System.out.println("List Before: " + list);
for (Iterator<String> it=list.iterator(); it.hasNext();) {
    if (!it.next().contains("How"))
        it.remove(); // NOTE: Iterator remove method, not ArrayList's, is used.
}
System.out.println("List After: " + list);

ВЫВОД:

List Before: [How are you?, How you doing?, Joe, Mike]
List After: [How are you?, How you doing?]

Ответ 4

напишите себе функцию фильтра

 public List<T> filter(Predicate<T> criteria, List<T> list) {
        return list.stream().filter(criteria).collect(Collectors.<T>toList());
 }

И затем используйте

    list = new Test().filter(x -> x > 2, list);

Это самая опрятная версия на Java, но для поддержки вычисления лямбда JDK 1.8 требуется JDK 1.8.

Ответ 5

Я согласен с предыдущим ответом, что Google Guava, вероятно, помогает здесь много, читабельность:

final Iterables.removeIf(list, new Predicate<String>() {
    @Override
    public boolean apply(String input) {
        if(input.contains("How")) { //or more complex pattern matching
            return true;
        }
        return false;
    }
}); 

Обратите внимание, что это в основном дубликат Guava - Как удалить из списка на основе предиката, отслеживая, что было удалено?

Ответ 6

Поскольку вы не предоставили нам очень много информации, я предполагаю, что язык, на котором вы пишете код, находится в С#. Прежде всего: Предпочитаете System.Collections.Generic.List над ArrayList. Во-вторых: одним из способов было бы перебрать каждый элемент в списке и проверить, содержит ли он "Как". Другой способ - использовать LINQ. Вот быстрый пример, который отфильтровывает каждый элемент, который не содержит "Как":

var list = new List<string>();
list.AddRange(new string[] {
    "How are you?",
    "How you doing?",
    "Joe",
    "Mike", });

foreach (string str in list.Where(s => s.Contains("How")))
{
    Console.WriteLine(str);
}
Console.ReadLine();