2012-02-05 68 views
29

你如何从一个Java的ArrayList筛选出的东西一样,如果您有:ArrayList的过滤器

  1. 你怎么样
  2. 你怎么样
  3. 迈克

而且过滤器是“如何”它将消除乔和迈克。

+4

这可能帮助HTTP://计算器。COM /问题/ 122105/Java的东西,是最最好的方式 - 至 - 过滤器 - 一个收集 – 2012-02-05 01:50:53

+0

最好的解决办法是使用一些其他集合的数据结构,而不是一个ArrayList:http://code.google。 COM/p /谷歌的集合/ – 2012-02-05 01:50:55

回答

48

也许最好的方法是使用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 

如果你想过滤的集合作为一个列表,你可以使用这个(也番石榴):

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

Collections2中的2是什么? – 2014-01-07 19:20:23

+0

@ DavoudTaghawi - 内贾德这可能是因为已经有'在标准的Java类Collections'。因此,很清楚哪些类是哪一类,如果它们在一个类中使用,则不必使用完全限定的名称来区分它们。 – user219882 2014-01-08 21:45:21

+0

它给人的谓语错误作谓语不能在android系统解决.. – karan421 2014-02-06 11:34:18

-9

由于您没有给我们提供太多的信息,我假设您正在编写代码的语言是C#。首先:首选ArrayList上的System.Collections.Generic.List。其次:一种方法是遍历列表中的每个项目,并检查它是否包含“如何”。另一种方法是使用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(); 
+1

“当你没有给我们非常多的信息”,但你的信息,帖子被标记为Java。 – 2016-08-05 04:57:41

+1

@NeonWarge检查编辑历史... http://stackoverflow.com/posts/9146224/revisions“Java”的标签,后来这个答案后加入。 – 2016-12-06 05:09:13

22

迭代通过列表,并检查是否包含你的字符串“如何”,如果它不然后取出。您可以使用下面的代码:

// 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); 

OUTPUT:

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

第一次调用it.next()会返回什么? – ArtOfWarfare 2012-09-04 15:41:41

+1

第一次调用'it.next()'返回集合(列表)中的第一个项目。 – anubhava 2012-09-04 17:23:51

+1

我喜欢这个,因为它是最简单的一个,不涉及第三方库。 – Christopher 2016-05-03 10:49:00

5

重复写你自己的过滤功能

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,支持演算

43

,他们推出这需要一个Predicate作为参数的方法removeIf

所以它会很容易为:

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