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 过滤器 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用对象的字段过滤 ArrayList

根据索引 id 的 ArrayList 过滤 JavaRDD

Java中ArrayList的交集和并集

Java中ArrayList的交集和并集

根据Java中对象属性的最常见值过滤对象的Arraylist

将 Long(来自构造函数)转换为 String 后过滤 ArrayList