2012-03-15 18 views
7

Merhaba Aynı nesnelere sahip 2 tane listelem var. Karşılaştırma için eşitlik kullanamadığım için, müdahale kullanarak birleşme, birleşme, ayrı gibi herhangi bir işlem yapmak istiyorum.java interscect, birleştirme, birleştirme, farklı listelenmiş listeler

Örnek:

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

Şimdi Otomobil iki listeleri vardır. Bu listelerde kopyaları bulmam gerekiyor, ancak sadece renk ile değil.

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

Ben carList1 ikinci nesne (yeşil yeni araba (2,)) ben LINQ için kullanacağı C#

Collection.intersect(carList1,carList2,comparator). 

benzer

Liste şey bulmalıyız. Yüklemler destekleyen bu denilen Apache Funktör Commons için bir kütüphane mevcuttur

+0

siz "yüklem" ile neyi kastediyoruz çağrı kesiştiği Daha

? Eşit olup olmadığını bulmak için iki nesneyi karşılaştırmak isterseniz, nesneler eşitse 0 döndüren Karşılaştırıcı arabirimini kullanabilirsiniz. Burada: http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html –

+0

Bunun için kitaplık yöntemleri yoktur. Bunu kendi başına yapmalısın. –

+2

Benzer soru: http://stackoverflow.com/questions/5793907/filtering-on-list-based-on-one-property-with-guava – simon

cevap

4

Guava'u kullanarak benzer düşünebilirsiniz.

1) kesişim, listelerde değil, kümelerdeki işlemdir. Eğer özel karşılaştırıcı (söz yüklem)

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 gerekiyorsa Yani,

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

gibi onları inşa veya olmalıdır: Sen iki seti oluşturmak için sadece tek yönde kullanmalıdır.

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

"Sets.intersection" öğesinin Javadoc'undan: "Set1 ise sonuçlar tanımsızdır ve set2 farklı eşdeğerlik ilişkilerine dayanan kümelerdir (HashSet, TreeSet ve bir IdentityHashMap'in tümünün kilit kümesi). " –

+0

@Louis Wasserman, set oluşturmanın iki yolunu gösteriyorum. Cevap açıklama ile güncellendi. –

+0

TreeSet yaklaşımının işe yarayacağından emin misiniz? Java belgelerinde (https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html) kesişim, içerme yöntemine bağlıdır. içerilen nesneler. – Regorsmitz