2012-02-05 69 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"));