2012-03-15 20 views
7

Xin chào tôi có 2 danh sách chứa cùng một đối tượng. Tôi muốn thực hiện bất kỳ hoạt động nào như intercesct, union, khác biệt bằng cách sử dụng vị từ vì tôi không thể sử dụng bằng so sánh.java interscect, union, join, danh sách riêng biệt với vị từ

Ví dụ:

class Car{ 
    public String id; 
    public String color; 
    public int hashcode(){ 
    //id field is used for hashcode 
    } 
    public boolean equals(){ 
    //id field is used for equals 
    } 
} 

Bây giờ tôi có hai danh sách của Ô tô. Tôi cần phải tìm các bản sao trong danh sách này nhưng không tìm thấy bằng id theo màu.

List<Car> carList1 = new ArrayList(){ new Car(1,blue), new Car(2,green)}; 
List<Car> carList2 = new ArrayList(){ new Car(1,silver), new Car(4,green)}; 

Tôi cần phải tìm đối tượng thứ hai từ carList1 (xe mới (2, màu xanh lá cây))

Danh sách Something tương tự như

Collection.intersect(carList1,carList2,comparator). 

Trong C# Tôi sẽ sử dụng cho nó LINQ.

+0

Ý anh là gì bởi "vị ngữ"? Nếu bạn muốn so sánh hai đối tượng để tìm nếu bạn bằng nhau, bạn có thể sử dụng giao diện Comparator trả về 0 nếu các đối tượng bằng nhau. Ở đây: http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html –

+0

Không có phương pháp thư viện nào cho việc này. Bạn phải làm điều đó một mình. –

+2

Câu hỏi tương tự: http://stackoverflow.com/questions/5793907/filtering-on-list-based-on-one-property-with-guava – simon

Trả lời

4

Bạn có thể thực hiện suy nghĩ tương tự bằng cách sử dụng Guava.

1) giao nhau là hoạt động trên các bộ chứ không phải trên danh sách. Vì vậy, bạn nên xây dựng họ như

final Set<Car> first = ImmutableSet.of(new Car(1, "blue"), new Car(2, "green")); 

hoặc, nếu bạn cần so sánh đặc biệt (vị ngữ đề cập)

final Set<Car> second = newTreeSet(new Comparator<Car>(){ 
    public int compare(final Car o1, final Car o2){ 
     return o1.getColor().compare(o2.getColor()); //return 0 when predicate return true 
    } 
}); 
second.add(new Car(1, "green") ); 

UPD: Bạn nên sử dụng chỉ có một cách để xây dựng cả hai bộ.

Thần ngã tư gọi

final Set<Car> intersection = Sets.intersection(first, second); 
+1

Từ Javadoc của 'Sets.intersection':" Kết quả không xác định nếu set1 và set2 là các bộ dựa trên các mối quan hệ tương đương khác nhau (như HashSet, TreeSet, và bộ khóa của một IdentityHashMap tất cả đều là). " –

+0

@Louis Wasserman, tôi vừa trình bày hai cách để xây dựng bộ. Đã cập nhật câu trả lời với làm rõ. –

+0

Bạn có chắc chắn rằng phương pháp TreeSet sẽ hoạt động? Trong các tài liệu Java (https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html) có vẻ như giao lộ dựa trên phương thức chứa, mà lần lượt dựa vào phương thức bằng các đối tượng chứa. – Regorsmitz

0

Có một thư viện cho điều này được gọi là Apache functor Commons có hỗ trợ vị từ vv

http://commons.apache.org/functor/

Ngoài ra còn có ổi mà một trong những bình luận chỉ ra:

http://code.google.com/p/guava-libraries/

Bạn có thể viết của riêng bạn bằng cách sử dụng sánh, nhưng để làm những việc như giao nhau, tham gia, vv dễ dàng hơn của nó chỉ để sử dụng một trong những thư viện này.

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