2012-06-11 36 views
12

Tôi có một danh sách các mục và tôi muốn tìm danh sách các mục có thuộc tính boolean x=true.Cách tìm các yếu tố trong bộ sưu tập theo bất động sản?

Tôi biết rằng điều này có thể được thực hiện bằng cách lặp lại, nhưng tôi đã tìm kiếm một phương pháp phổ biến để làm điều đó trong thư viện commons như Apache Commons.

+0

tài sản = biến lĩnh vực? – dacwe

+0

@dacwe, vâng, đó là ý tôi, xin lỗi. –

+0

Làm thế nào để bạn hiểu 'phương pháp chung'? –

Trả lời

11

Vấn đề là việc lặp lại trong Java thường đơn giản và sạch hơn nhiều. Có lẽ Java 8's Closures sẽ sửa lỗi này. ;)

So sánh với giải pháp @ Spaeth.

List<String> mixedup = Arrays.asList("A", "0", "B", "C", "1", "D", "F", "3"); 
List<String> numbersOnlyList = new ArrayList<>(); 
for (String s : mixedup) { 
    try { 
     // here you could evaluate you property or field 
     Integer.valueOf(s); 
     numbersOnlyList.add(s); 
    } catch (NumberFormatException ignored) { 
    } 
} 
System.out.println("Results of the iterated List: " + numbersOnlyList); 

Như bạn có thể thấy ngắn hơn và ngắn gọn hơn nhiều.

+3

Nếu bạn có các biến vị ngữ được mã hóa cứng thì đúng. Nhưng khi bạn cần phải mở rộng logic và cung cấp các yếu tố khác nhau cho biểu thức logic mà cuối cùng cung cấp cho bộ dữ liệu thích hợp sạch hơn là một số API thành ngữ chức năng như đề xuất ổi. –

+0

@Vash +1 Điều này đúng, nhưng tương đối hiếm. BTW: Tôi sử dụng các vị từ trong một thư viện mà tôi đã viết nên tôi không chống lại chúng. –

21

Bạn có thể sử dụng bộ sưu tập apache commons thực hiện một Predicate cho nó.

http://commons.apache.org/collections/apidocs/org/apache/commons/collections/CollectionUtils.html

mẫu:

package snippet; 

import java.util.Arrays; 
import java.util.Collection; 

import org.apache.commons.collections.CollectionUtils; 
import org.apache.commons.collections.Predicate; 

public class TestCollection { 

    public static class User { 

     private String name; 

     public User(String name) { 
      super(); 
      this.name = name; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     @Override 
     public String toString() { 
      return "User [name=" + name + "]"; 
     } 

    } 

    public static void main(String[] args) { 
     Collection<User> users = Arrays.asList(new User("User Name 1"), new User("User Name 2"), new User("Another User")); 
     Predicate predicate = new Predicate() { 

      public boolean evaluate(Object object) { 
       return ((User) object).getName().startsWith("User"); 
      } 
     }; 
     Collection filtered = CollectionUtils.select(users, predicate); 
     System.out.println(filtered); 
    } 
} 

Một vài mẫu có thể được tìm thấy ở đây: http://apachecommonstipsandtricks.blogspot.de/2009/01/examples-of-functors-transformers.html

Và nếu bạn cần một cái gì đó chung chung hơn, như kiểm tra một giá trị của một trường hoặc tài sản cụ thể bạn có thể làm điều gì đó như:

public static class MyPredicate implements Predicate { 

    private Object expected; 
    private String propertyName; 

    public MyPredicate(String propertyName, Object expected) { 
     super(); 
     this.propertyName = propertyName; 
     this.expected = expected; 
    } 

    public boolean evaluate(Object object) { 
     try { 
      return expected.equals(PropertyUtils.getProperty(object, propertyName)); 
     } catch (Exception e) { 
      return false; 
     } 
    } 

} 

Điều đó có thể so sánh một tài sản cụ thể cho một giá trị kỳ vọng, và việc sử dụng sẽ là một cái gì đó như:

Collection filtered = CollectionUtils.select(users, new MyPredicate("name", "User Name 2")); 
+0

Cảm ơn vị ngữ :) –

+1

Đây phải là câu trả lời được chọn. –

+1

Việc sử dụng CollectionsUtils.select có trả lại bộ sưu tập mới hay không, bộ sưu tập mới này có chứa tham chiếu đến bộ sưu tập gốc hay không. Tôi đã cố gắng sử dụng điều này bằng cách xác định vị từ của riêng tôi, tuy nhiên cả hai bộ sưu tập của tôi đang được sửa đổi. – Rohan

1

Để đạt được điều này Trong java, bạn có thể Override hashCode và equals phương pháp -

ví dụ

@Override 
public int hashCode() { 
    return eventId; 
} 

@Override 
public boolean equals(Object obj) { 
    if(obj instanceof CompanyTimelineView) { 
     CompanyTimelineView new_name = (CompanyTimelineView) obj; 
     if(new_name.eventId.intValue() == this.eventId.intValue()){ 
      return true; 
     } 
    } 
    return false; 
} 

trong ví dụ này tôi đã tạo giá trị số nguyên eventId. Bạn có thể sử dụng lớp học và tài sản của mình ở đây. Sau này, bạn có thể sử dụng danh sách chứa, indexOf, lastIndexOf và nhận được phương pháp để tìm phần tử trong danh sách. Xem bên dưới.

//tempObj is nothing but an empty object containing the essential properties 
//tempObj should posses all the properties that are being compared in equals method. 

if(listOfObj.contains(tempObj)){ 
    return listOfObj.get(listOfObj.indexOf(tempObj)); 
} 
4

Bạn có thể sử dụng phương pháp Google guava 'filter để thực hiện việc này. Commons cũng có một phương thức filter

Các vấn đề liên quan