Фильтр 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
В java-8, они ввели метод 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();