2012-03-15 12 views
7

Ciao Ho 2 liste che contengono gli stessi oggetti. Vorrei eseguire qualsiasi operazione come intercesct, union, distinct usando il predicato perché non sono in grado di utilizzare equals to comparision.java interscect, union, join, liste distinte con predicato

Esempio:

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

ora ho due elenchi di Cars. Ho bisogno di trovare i duplicati in questo elenco ma non per id solo per colore.

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

ho bisogno di trovare secondo oggetto da carList1 (nuova auto (2, verde))

Lista Qualcosa di simile a

Collection.intersect(carList1,carList2,comparator). 

In C# vorrei utilizzare per esso LINQ.

+0

Cosa si intende per "predicato"? Se vuoi confrontare due oggetti per trovare se sei uguale puoi usare l'interfaccia Comparator che restituisce 0 se gli oggetti sono uguali. Qui: http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html –

+0

Non esistono metodi di libreria per questo. Devi farlo da solo. –

+2

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

risposta

4

Si può fare lo stesso con Guava.

1) intersect è un'operazione su insiemi, non su elenchi. Così li si dovrebbe costruire come

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

o, se avete bisogno di confronto speciali (predicato citato)

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: Si dovrebbe utilizzare un solo modo per costruire entrambi i set.

Than chiamata intersezione

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

Dal Javadoc di 'Sets.intersection':" I risultati non sono definiti se set1 e set2 sono insiemi basati su diverse relazioni di equivalenza (come HashSet, TreeSet e KeySet di IdentityHashMap). " –

+0

@Louis Wasserman, ho appena mostrato due modi per costruire insiemi. Risposta aggiornata con chiarimenti. –

+0

Sei sicuro che l'approccio TreeSet funzionerebbe? Nei documenti Java (https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html) sembra che l'intersezione si basi sul metodo contiene, che a sua volta si basa sul metodo di uguaglianza di gli oggetti contenuti – Regorsmitz