Ich habe zwei Sammlungen desselben Objekts, Collection oldSet
und Collection newSet
. Die erforderliche Logik lautet wie folgt:
- wenn
foo
inoldSet
ist, aber nicht innewSet
, rufedoRemove(foo)
auf - oder wenn
foo
nicht inoldSet
ist, aber innewSet
, rufedoAdd(foo)
auf - oder wenn
foo
in beiden Sammlungen ist, aber geändert, rufedoUpdate(oldFoo, newFoo)
auf - oder wenn
!foo.activated && foo.startDate >= now
, rufedoStart(foo)
auf - oder wenn
foo.activated && foo.endDate <= now
, rufedoEnd(foo)
auf
(*) "in" bedeutet, dass der eindeutige Bezeichner übereinstimmt, nicht unbedingt der Inhalt.
Der aktuelle (legacy) Code führt viele Vergleiche durch, um removeSet
, addSet
, updateSet
, startSet
und endSet
zu ermitteln und dann iteriert und auf jedes Element angewendet.
Der Code ist ziemlich unübersichtlich (teilweise, weil ich bereits einige Spaghetti-Logik weggelassen habe) und ich versuche, ihn zu überarbeiten. Einige zusätzliche Hintergrundinformationen:
- Soweit ich weiß, werden die
oldSet
undnewSet
tatsächlich vonArrayList
unterstützt - Jede Sammlung enthält weniger als 100 Elemente, höchstwahrscheinlich maximal 20
- Dieser Code wird häufig aufgerufen (in Millionen/Tag gemessen), obwohl sich die Sets selten unterscheiden
Meine Fragen:
- Wenn ich
oldSet
undnewSet
inHashMap
umwandele (die Reihenfolge ist hier nicht relevant), würde der Code dann leichter lesbar und einfacher vergleichbar sein? Wie viel Zeit- und Speicherleistung geht durch die Konvertierung verloren? - Wäre es effizienter und prägnanter, die beiden Sets zu durchlaufen und die entsprechenden Operationen durchzuführen?