Tengo dos colecciones del mismo objeto, Collection<Foo> oldSet
y Collection<Foo> newSet
. La lógica requerida es la siguiente:¿Cuál es la mejor manera de comparar dos colecciones en Java y actuar sobre ellas?
- si
foo
está en (*)oldSet
pero nonewSet
, llamedoRemove(foo)
- más si
foo
no está enoldSet
pero ennewSet
, llamedoAdd(foo)
- más si
foo
es en ambas colecciones pero modificadas, llame adoUpdate(oldFoo, newFoo)
- else si
!foo.activated && foo.startDate >= now
, llame aldoStart(foo)
- persona si
foo.activated && foo.endDate <= now
, llamedoEnd(foo)
(*) "en" significa que los partidos identificador único, no necesariamente el contenido.
El (legacy) código actual hace muchas comparaciones de averiguar removeSet
, addSet
, updateSet
, startSet
y endSet
, y luego bucle para actuar sobre cada elemento.
El código es bastante desordenado (en parte porque ya he omitido algo de lógica de spaghetti) y estoy tratando de refactorizarlo. Algunos más información de fondo:
- Por lo que yo sé, el
oldSet
ynewSet
en realidad están respaldados porArrayList
- Cada juego contiene menos de 100 artículos, más probable es máximo hacia fuera en 20
- Este código se llama frecuencia (medido en millones/día), aunque rara vez los conjuntos difieren
Mis preguntas:
- Si convierto
oldSet
ynewSet
enHashMap<Foo>
(el orden no es motivo de preocupación), con los ID como claves, ¿facilitaría la lectura y la comparación del código? ¿Cuánto de tiempo & el rendimiento de la memoria es pérdida en la conversión? - ¿Sería más eficiente y conciso iterar los dos conjuntos y realizar la operación apropiada?
+1 por sugerir un sólido URL biblioteca –
ya no está disponible. :( –
http://commons.apache.org/proper/commons-collections/javadocs/api-4.0/index.html –