2012-02-05 32 views
29

Làm thế nào bạn có thể lọc ra một cái gì đó từ một ArrayList Java như thế nào nếu bạn có:ArrayList lọc

  1. How are you
  2. Làm thế nào bạn làm
  3. Joe
  4. Mike

Và bộ lọc là "Làm thế nào" nó sẽ loại bỏ Joe và Mike.

+4

này có thể giúp http: // stackoverflow.com/questions/122105/java-what-là-the-best-way-to-filter-a-bộ sưu tập –

+0

giải pháp tốt nhất là sử dụng một số cấu trúc dữ liệu bộ sưu tập khác thay vì một danh sách mảng: http://code.google. com/p/google-collections/ –

Trả lời

48

Có lẽ cách tốt nhất là sử dụng 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); 

in

How are you 
How you doing 

Trong trường hợp bạn muốn để có được những bộ sưu tập được lọc như một danh sách, bạn có thể sử dụng này (cũng từ Ổi):

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

2 trong Bộ sưu tập2 là gì? –

+0

@ DavoudTaghawi-Nejad Đó có thể là do đã có lớp 'Bộ sưu tập' trong Java chuẩn. Vì vậy, rõ ràng là lớp nào là lớp và bạn không phải sử dụng tên đủ điều kiện để phân biệt giữa chúng trong trường hợp chúng được sử dụng trong một lớp. – user219882

+0

lỗi của nó trên Predicates như Predicate không thể được giải quyết trong android .. – karan421

-9

Vì bạn không cung cấp cho chúng tôi nhiều thông tin, tôi giả sử ngôn ngữ bạn đang viết mã là C#. Trước hết: Ưu tiên System.Collections.Generic.List trên một ArrayList. Thứ hai: Một cách sẽ là lặp qua tất cả các mục trong danh sách và kiểm tra xem nó có chứa "Cách" hay không. Một cách khác là sử dụng LINQ. Dưới đây là ví dụ nhanh để lọc ra tất cả các mục không chứa "Cách":

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

"Vì bạn không cung cấp cho chúng tôi nhiều thông tin", nhưng có thông tin của bạn, bài đăng được gắn thẻ với Java. –

+1

@NeonWarge kiểm tra lịch sử chỉnh sửa ... http://stackoverflow.com/posts/9146224/revisions Thẻ "Java" đã được thêm sau sau câu trả lời này. –

22

Lặp lại danh sách và kiểm tra xem có chứa chuỗi của bạn "Cách" và nếu có thì xóa. Bạn có thể sử dụng đoạn mã sau:

// 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() trả về lần đầu tiên nó được gọi là gì? – ArtOfWarfare

+1

Gọi 'it.next()' lần đầu tiên trả về mục đầu tiên từ bộ sưu tập (danh sách). – anubhava

+1

Tôi thích cái này vì nó là cái đơn giản nhất mà không liên quan đến thư viện của bên thứ ba. – Christopher

2

Tôi đồng ý với một câu trả lời trước đó Google Guava có lẽ giúp rất nhiều ở đây, khả năng đọc-khôn ngoan:

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

Xin lưu ý rằng đây là cơ bản là một bản sao của Guava - How to remove from a list, based on a predicate, keeping track of what was removed?

5

viết tự của bạn một chức năng lọc

public List<T> filter(Predicate<T> criteria, List<T> list) { 
     return list.stream().filter(criteria).collect(Collectors.<T>toList()); 
} 

Và sau đó sử dụng

list = new Test().filter(x -> x > 2, list); 

Đây là phiên bản gọn gàng nhất trong Java, nhưng cần JDK 1.8 để hỗ trợ phép tính lambda

43

Trong , họ đã giới thiệu phương pháp removeIf mà phải mất một Predicate như tham số.

Vì vậy, nó sẽ được dễ dàng như:

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