Vergleichen von zwei Listen und Erhalten von Unterschieden

8

Ich habe zwei Listen. Sie enthalten Objekte verschiedener Typen, aber beide Typen enthalten ID und Name, und ID ist, was ich vergleiche. Liste eins wird aus DB abgerufen, und Liste zwei wird von Frontend gesendet.

Was ich tun muss, ist, sie zu durchlaufen und herauszufinden, welches Listenelement neu hinzugefügt wurde und welches gelöscht wurde.

Ich konnte es tun, aber das Problem ist, dass es hässlich aussieht.

Nehmen wir an, ich habe ein Objekt namens NameDTO, das eine ID und einen Namen haben kann. Liste zwei ist mit diesem Typ von Objekten gefüllt.

So habe ich es gemacht:

%Vor%

Das funktioniert, ich habe es getestet. Gibt es bessere Lösungen? Ich dachte daran Sets zu benutzen, damit ich sie vergleichen kann. Gibt es da einen Nachteil?

    
mirzak 03.02.2017, 14:09
quelle

4 Antworten

8

Wenn ich das richtig verstehe, ist dies das Beispielszenario:

  • listOne [Datenbank] Elemente: [A, B, C, D]
  • listTwo [vordere] Elemente: [B, C, D, E, F]

und was Sie als Wirkung haben müssen, ist:

  • hinzugefügt: [E, F]
  • gelöscht: [A]

Zuerst würde ich einen Typadapter verwenden oder die verschiedenen Typen von einer gemeinsamen Klasse und override der equals -Methode erweitern, damit Sie sie mit id und name

abgleichen können

Zweitens ist dies eine sehr einfache Bedienung von Sätzen (Sie könnten Sätze verwenden, aber die Liste ist auch in Ordnung). Ich empfehle die Verwendung einer Bibliothek: Ссылка

Und jetzt im Grunde:

  • hinzugefügt ist listTwo - listOne
  • gelöscht ist listOne - listTwo

und mit Java-Code:

  • hinzugefügt: CollectionUtils.removeAll(listTwo, listOne)
  • gelöscht: CollectionUtils.removeAll(listOne, listTwo)

Andernfalls werden alle Sammlungen implementiert, die Collection ( Java Docs ) hat auch removeAll Methode, die Sie verwenden können.

    
Atais 03.02.2017, 14:22
quelle
4

Diese verschachtelte Listenverarbeitung ist nicht nur hässlich, sondern auch ineffizient. Es ist immer besser, die IDs einer Liste in einem Set zu speichern, um eine effiziente Suche zu ermöglichen, und dann die andere Liste mit Set zu bearbeiten. Auf diese Weise führen Sie nicht list1.size() mal list2.size() -Operationen, sondern list1.size() plus list2.size() -Operationen durch, was ein bedeutender Unterschied für größere Listen ist. Da beide Operationen grundsätzlich gleich sind, lohnt es sich, sie zu einer Methode zusammenzufassen:

%Vor%

Diese Methode kann als

verwendet werden %Vor%

Da das Vertauschen der beiden Listen erfordert, dass die Hilfsmethode unabhängig von den Elementtypen ist, erwartet sie Funktionen für den Zugriff auf die ID-Eigenschaft, die über Methodenreferenzen angegeben werden können. Dann ist eine Funktion erforderlich, die das Ergebniselement beschreibt, das in einem Fall eine Identitätsfunktion ist (nur das NamedDTO erhalten) und ein Lambda-Ausdruck ein NamedDTO von SomeObject im anderen erzeugt.

Die Operation selbst ist so einfach wie oben beschrieben, iteriere über eine Liste, mappe auf die ID und sammle in Set , dann iteriere über die andere Liste, behalte nur Elemente, deren ID nicht in der Menge ist , ordnen Sie dem Ergebnistyp zu und sammeln Sie in List .

    
Holger 03.02.2017 14:55
quelle
4

Ich schlage Lösung mit Java 8 Streams vor:

%Vor%

Dies ist im Grunde Ihre Lösung, aber implementiert mit Streams, die Ihren Code kürzer und einfacher zu lesen macht

    
Kamil Banaszczyk 03.02.2017 15:14
quelle
2

Wenn diese IDs eindeutig sind, könnten Sie sie in ein HashSet einfügen und so die IDs finden, an denen Sie interessiert sind:

%Vor%

Ich habe die Klassen FromUI und FromDB mit einem Konstruktor erstellt, der die ID und den Namen als Eingabe akzeptiert.

Ich gehe auch davon aus, dass, wenn ein Element in uiSet enthalten ist, aber nicht in dbSet hinzugefügt wurde und umgekehrt.

    
Eugene 03.02.2017 14:41
quelle

Tags und Links