42 Stimmen

Wie vergleicht man am besten zwei Sammlungen in Java und handelt entsprechend?

Ich habe zwei Sammlungen desselben Objekts, Collection oldSet und Collection newSet. Die erforderliche Logik lautet wie folgt:

  • wenn foo in oldSet ist, aber nicht in newSet, rufe doRemove(foo) auf
  • oder wenn foo nicht in oldSet ist, aber in newSet, rufe doAdd(foo) auf
  • oder wenn foo in beiden Sammlungen ist, aber geändert, rufe doUpdate(oldFoo, newFoo) auf
  • oder wenn !foo.activated && foo.startDate >= now, rufe doStart(foo) auf
  • oder wenn foo.activated && foo.endDate <= now, rufe doEnd(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 und newSet tatsächlich von ArrayList 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 und newSet in HashMap 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?

0voto

pooja Punkte 11
public static boolean doCollectionsContainSameElements(
        Collection c1, Collection c2){

    if (c1 == null || c2 == null) {
        return false;
    }
    else if (c1.size() != c2.size()) {
        return false;
    } else {    
        return c1.containsAll(c2) && c2.containsAll(c1);
    }       
}

-1voto

Mike Deck Punkte 17515

Für eine so kleine Menge lohnt es sich in der Regel nicht, von einem Array in eine HashMap/set umzuwandeln. Tatsächlich ist es wahrscheinlich am besten, sie in einem Array zu behalten und sie dann nach Schlüssel zu sortieren und über beide Listen gleichzeitig zu iterieren, um den Vergleich durchzuführen.

-2voto

Lijo Mathew Punkte 1

Zum Vergleich einer Liste oder einer Menge können wir Arrays.equals(object[], object[]) verwenden. Es überprüft nur die Werte. Um das Object[] zu erhalten, können wir die Methode Collection.toArray() verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X