ArrayList 过滤器 [重复]
Posted
技术标签:
【中文标题】ArrayList 过滤器 [重复]【英文标题】:ArrayList filter [duplicate] 【发布时间】:2012-02-27 02:35:50 【问题描述】:如何从 Java ArrayList 中过滤掉某些内容,例如:
-
你好吗
你好吗
乔
迈克
过滤器是“如何”删除 Joe 和 Mike。
【问题讨论】:
这可能会有所帮助***.com/questions/122105/… 最好的解决方案是使用其他集合数据结构而不是数组列表:code.google.com/p/google-collections 【参考方案1】:在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"));
【讨论】:
调用需要 API 级别 24【参考方案2】:可能最好的方法是使用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")));
【讨论】:
Collections2 中的 2 是什么? @DavoudTaghawi-Nejad 这可能是因为标准 Java 中已经有Collections
类。所以很清楚哪个类是哪个类,您不必使用完全限定名称来区分它们,以防它们在一个类中使用。
它在谓词上给出错误作为谓词无法在android中解决..
知道了..我使用的库不正确..现在我使用的是 guava-16.0.1.jar
@taymedee 使用 not()
: filter(list, not(Predicates.containsPattern("How"))
【参考方案3】:
遍历列表并检查是否包含您的字符串“How”,如果包含则删除。您可以使用以下代码:
// 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's 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?]
【讨论】:
it.next() 第一次调用时返回什么? 第一次调用it.next()
会返回集合(列表)中的第一个项目。
我喜欢这个,因为它是最简单的,不涉及第三方库。【参考方案4】:
给自己写一个过滤函数
public<T> 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 来支持 lambda 演算
【讨论】:
【参考方案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 - How to remove from a list, based on a predicate, keeping track of what was removed?的副本
【讨论】:
【参考方案6】:由于您没有向我们提供太多信息,我假设您编写代码的语言是 C#。 首先:首选 System.Collections.Generic.List 而不是 ArrayList。 其次:一种方法是遍历列表中的每个项目并检查它是否包含“如何”。另一种方法是使用 LINQ。这是一个过滤掉所有不包含“How”的项目的快速示例:
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();
【讨论】:
“因为你没有给我们太多信息”,但是有你的信息,帖子被标记为Java。 @NeonWarge 检查编辑历史...***.com/posts/9146224/revisions "Java" 标签是在此答案之后添加的。以上是关于ArrayList 过滤器 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
根据索引 id 的 ArrayList 过滤 JavaRDD