2012-08-01 6 views
5

Esiste un meccanismo di Equalizzatore come il Comparatore, quindi posso avere diversi uguali per gli elenchi di coparing?A Meccanismo per avere diversi uguali (fisico equo e logico uguale) sugli oggetti nella Raccolta

EDIT: Il mio obiettivo è quello di distinguere tra list1.equals attuali (list2), che controlla se la sua una copia o una copia profonda con tutti gli oggetti a.equals (b) e list1.identical (list2), che controlla se la sua copia è semplicemente superficiale con l'elenco non modificato

Tutti questi elenchi provengono dallo stesso modello. Alcuni sono copie di se stessi in modo da mantenere il puntatore agli stessi oggetti, mentre altri sono copie profonde, quindi la gerarchia è completamente replicata, poiché hanno aggiornamenti nel contenuto, non solo nella struttura.

Mi trovo spesso makin list1.equals (lista2) ma ho bisogno di un meccanismo per dire se entrambe sono copie TOTALI (stessi oggetti nello stesso ordine per le raccolte) o talvolta se sono copie LOGICHE (attraverso la mia logica implementata equivale), quindi la lista chiamerebbe equals e gli oggetti dovrebbero implementare qualcosa di più di un == b.

Il mio problema è che non c'è alcuna interfaccia Equalator, e se sovrascrivo oggetti equivale al perdo la capacità di confrontare da TOTAL EQUAL (a == b)

Ad esempio, questo sarebbe bello;

Collections.equal(l1,l2,new Equalator(){ 
    @Override public boolean equals(Obj1,Obj2){ 
      //Default lists comparison plus commparison of objects based on 
      return (obj1.propertyX() == obj2.propertyX()); 
    } 
}); 

ed ancora ho potuto fare list1.equals (list2) in modo da utilizzare eguali di default (obj1 == obj2) e questo sarebbe vero solo se gli oggetti contenuti sono esattamente gli stessi.

La prima operazione è utile per verificare se l'elenco (che potrebbe essere un elenco aggiornato con oggetti completamente ricreati dal modello) è ancora uguale alla vecchia lista.

La seconda operazione è utile per verificare se l'elenco (che era una copia superficiale della vecchia versione corrente del modello dati), non contiene alcuna modifica trascendente dallo spostamento all'interno del codice quando era la versione udpdated.

MODIFICA: Un ottimo esempio sarebbe avere un elenco di punti (x, y). Dovremmo essere in grado di sapere se entrambe le liste sono uguali perché sono esattamente lo stesso insieme di punti o uguali perché i punti che contengono sono uguali in modo logico. Se potessimo implementare sia phyEqual che logEqual su object, e avere entrambi i metodi in qualsiasi oggetto, list.phyEqual (list2) o list1.logEqual (list2)

+0

Hai un sacco di contesto, ma qual è la tua * domanda * reale qui? –

+0

Prima riga. Quindi definisco il mio problema. Scusa, ho iniziato con 'isn't there' invece di 'is there' e penso che sia per questo che il suo confuso elenco – Whimusical

risposta

2

La tua domanda non è chiara, almeno per me . Se questo non risponde correttamente, potresti riformulare un po '?

All'interno di un determinato tipo di raccolta concreta, le implementazioni più uguali fanno già ciò che accenno. Per esempio:

public boolean equals(Object o) { 
     if (o == this) 
      return true; 

In questo caso, qualcosa di simile potrebbe avere un senso.
Si può facilmente ignorare questo: [va aggiunto banco di prova per i null]

@Override 
    public boolean equals(Object o) { 
     if (o.getPrimaryKey() == this.getPrimaryKey()) 
      return true; 
     return super().equals(o); 

Se si sta creando collezioni standard, è possibile anche in forma anonima l'override del metodo equals durante la costruzione.

Se ciò non fa ciò che si desidera, è possibile estendere le raccolte autonomamente e ignorare qualsiasi metodo lì per fare una cosa simile.

Questo aiuto?

+0

abbia un uguale che sembra che entrambi gli elenchi abbiano le stesse dimensioni, stessi elementi e lo stesso ordine. Il problema è che usa uguale per dire se entrambi gli oggetti sono gli stessi, quindi significa che senza un'interfaccia di equalizzazione, devo cambiare l'intero framework per avere un'ulteriore catena di uguaglianze. Posso implementare gli uguali nei miei oggetti come uguali a livello logico o fisico, ma non riesco a fare lo swith all'altro tipo – Whimusical

+0

Ci sono pochissimi casi reali in cui esiste più di una definizione di uguali che è effettivamente utile a chiunque. –

+0

Elenco. list.equals (list2) se entrambi hanno le stesse dimensioni, elementi e l'ordine di essi (tenendo conto degli elementi sono uguali se soddisfano a.equals (b)). Ma list.equals2 (list2) potrebbe significare avere entrambe le stesse dimensioni, elementi e ordine (considerando che 2 obj sono uguali se a == b). Ovviamente, supponendo che non possiamo garantire a.equals (b) non è sovrascritto quindi non va oltre un == b – Whimusical

2

Una risposta in ritardo, ma forse sarà utile per qualcuno ...

La Guava Equivalence di classe è la stessa per equivalenza comparatore per il confronto. Dovresti scrivere il tuo metodo per confrontare gli elenchi (non c'è supporto in Guava per questo), ma puoi chiamare questo metodo con varie definizioni di equivalenza.

Oppure si può rotolare la propria interfaccia:

interface Equalator<T> { 
    boolean equals(T o1, T o2); 
} 

Anche in questo caso, è necessario scrivere il metodo (banale)

boolean <T> listEquals(List<T> list1, List<T> list2, Equalator<T> equalator) { 
    ... 
} 

... ma poi si può riutilizzare con diverse implementazioni ListEqualator .

Problemi correlati