C'è un modo migliore di solo scorrendo e confrontando manualmente i due campi per ogni oggetto e poi rompere quando si trova? Sembra solo così disordinato, alla ricerca di un modo migliore.
Se la vostra preoccupazione è la manutenibilità si potrebbe fare quello che Fabian Steeg suggeriscono (che è quello che vorrei fare) anche se probabilmente non è il "più efficace" (perché si deve ordinare l'array prima e quindi eseguire il file binario ricerca) ma certamente l'opzione più pulita e migliore.
Se si è veramente interessati all'efficienza, è possibile creare un'implementazione di Elenco personalizzata che utilizza il campo nell'oggetto come hash e utilizza una HashMap come memoria. Ma probabilmente questo sarebbe troppo.
Quindi è necessario modificare il luogo in cui si riempiono i dati da ArrayList a YourCustomList.
come:
List list = new ArrayList();
fillFromSoap(list);
A:
List list = new MyCustomSpecialList();
fillFromSoap(list);
L'implementazione sarebbe qualcosa di simile al seguente:
class MyCustomSpecialList extends AbstractList {
private Map<Integer, YourObject> internalMap;
public boolean add(YourObject o) {
internalMap.put(o.getThatFieldYouKnow(), o);
}
public boolean contains(YourObject o) {
return internalMap.containsKey(o.getThatFieldYouKnow());
}
}
Più o meno come un HashSet, il problema ecco che HashSet si basa sulla buona implementazione del metodo hashCode, che probabilmente non hai. Invece si usa come hash "quel campo che conosci" che è quello che rende un oggetto uguale all'altro.
Naturalmente l'attuazione di un elenco dal lotto zero 'più difficile del mio frammento di sopra, è per questo che dico che il suggerimento Fabian Steeg sarebbe meglio e più facile da implementare (anche se qualcosa di simile sarebbe più efficiente)
Contattaci cosa hai fatto alla fine
"HashSet.contains() ha un tempo di accesso costante, ad esempio O (1)" - potresti indicare una prova? Non dipende * pesantemente * dalla funzione hash? Se no, perché non dire semplicemente "Veloce nella pratica"? Altrimenti, penso che stiate diffondendo informazioni errate (probabilmente con le migliori intenzioni, però :)) –
@Jonas Kölker: Dalla documentazione: "Questa classe offre prestazioni a tempo costante per le operazioni di base (aggiungi, rimuovi, contiene e taglia), supponendo che la funzione hash disperde gli elementi correttamente tra i bucket. " –
@Jonas, mentre un'implementazione povera di hashCode() porterà a tempi di accesso lenti, qualsiasi testo di algoritmi (in particolare il testo CLR (S) a cui molte delle strutture di dati delle raccolte sono state ricavate - http://www.amazon.com/ Introduzione-Algoritmi-Terzo-Thomas-Cormen/dp/0262033844 /) ti dirà che le strutture dati basate su hash sono O (1) per la ricerca. È importante rendersi conto che O (1) non denota la ricerca in un solo passaggio, ma la ricerca non è correlata alle dimensioni della struttura dei dati. Pertanto anche con hashCode() s scadente, il tempo di ricerca è O (1). Wim non sta diffondendo alcuna disinformazione, anzi, è perfetto. – dimo414