si consiglia di guardare a questo articolo per ulteriori informazioni:
http://download-llnw.oracle.com/javase/tutorial/collections/interfaces/set.html
Come si è accennato, removeAll()
è fatto per questo, ma si vuole farlo due volte, in modo che è possibile creare una lista di tutti che mancano in entrambi, e allora si potrebbe combinare questi due risultati a avere una lista di tutte le differenze.
Tuttavia, questa è un'operazione distruttiva, quindi se non si desidera perdere le informazioni, copiare il Set
e operare su quello.
UPDATE:
Sembra che la mia assunzione di ciò che è nella matrice è sbagliato, quindi removeAll()
non funziona, ma con un requisito di 5 ms, depeending sul numero di elementi per la ricerca potrebbe essere un problema.
Quindi, sembrerebbe un HashMap<String, Animal>
sarebbe l'opzione migliore, in quanto è veloce nella ricerca.
Animal è un'interfaccia con almeno una proprietà, String name
. Per ogni classe che implementa il codice di scrittura Animal
per Equals
e hashCode
. Puoi trovare qualche discussione qui: http://www.ibm.com/developerworks/java/library/j-jtp05273.html. In questo modo, se vuoi che il valore hash sia una combinazione del tipo di animale e del nome, allora andrà bene.
Quindi, l'algoritmo di base è quello di mantenere tutto nelle hashmap e quindi cercare le differenze, basta ottenere una serie di chiavi e cercare attraverso per vedere se quella chiave è contenuta nell'altra lista, e se non è inseriscilo in un List<Object>
, memorizzando il valore lì. Si consiglia di eseguire questa operazione due volte, quindi, se si dispone di almeno un processore dual-core, si potrebbe trarre qualche vantaggio dall'avere fatto entrambe le ricerche in thread separati, ma poi si vorrà utilizzare uno dei tipi di dati simultanei aggiunto in JDK5 in modo da non doversi preoccupare delle sincronizzazioni nell'elenco combinato delle differenze.
Quindi, vorrei scriverlo prima come un thread singolo e testare, per ottenere alcune idee su quanto è più veloce, confrontandolo anche con l'implmemntation originale. Quindi, se ne hai bisogno più velocemente, prova a utilizzare i thread, ancora una volta, confronta per vedere se c'è un aumento di velocità.
Prima di eseguire qualsiasi ottimizzazione, assicurarsi di disporre di alcune metriche su ciò che si ha già, in modo da poter confrontare e vedere se l'unica modifica porterà ad un aumento della velocità.
Se si apportano troppe modifiche alla volta, si può avere un notevole miglioramento della velocità, ma altre possono comportare una diminuzione delle prestazioni e non si vedrebbe, motivo per cui ogni modifica dovrebbe essere tempo.
Tuttavia, non perdere le altre implementazioni, utilizzando i test unitari e testare forse 100 volte ciascuno, è possibile avere un'idea di quali miglioramenti ogni cambiamento ti dà.
possiamo sorta gli array? –
@Functional - Sì. –
Per evitare ulteriori equivoci, puoi correggere il tuo esempio e non farli essere oggetti, altrimenti ci imbatteremo in problemi con le soluzioni, in quanto quindi sarebbe necessario confrontare qualcosa all'interno di ciascun oggetto per vedere se sono uguali, come nuovo Cat() == nuovo Cat() = falso, poiché sono due oggetti diversi. –