2017-05-05 2 views
2

Ich habe zwei Collections oder Arraylists von möglicherweise ungleicher Größe, die verglichen werden müssen. Eine Sammlung ist eine neu heruntergeladene Sammlung von Objekten aus einer REST-Nutzlast. Ein weiterer ist eine Sammlung aus einem lokalen Repository der Sammlung von Objekten. Keine der Sammlungen wird doppelte Objekte haben.Java: Vergleich zweier Sammlungen für neue oder aktualisierte Objekte

Die Idee besteht darin, die neuen Objekte, die nicht im lokalen Repository vorhanden sind, oder Objekte, die in der heruntergeladenen Sammlung aktualisiert wurden, aus den vorhandenen Objekten im lokalen Repository zu finden. Dadurch schließlich die Klasse zwei Methoden haben eine Sammlung von neuen Objekten und aktualisierten Objekte

Signatur eines Objekts zurückzukehren besteht aus:

membershipObject: 
       id 
       start_date 
       end_date 
       uniqueId 

id und uniqueId in der Sammlung einzigartig sind, die es ideal macht Vergleiche sie. start_date würde normalerweise nicht ändern, aber end_date kann Null sein oder ein Datetime-Objekt haben. Ich habe eine Unterstützungsmethode, um herauszufinden, ob ein Objekt "aktiv" oder "inaktiv" ist, abhängig davon, ob end_datenull ist oder nicht.

Und Objekt gilt als aktualisiert, wenn die end_date seit meinem letzten Download geändert hat.

ZB:

downloadedCollection 
    0: 
     id: 1 
     start_date: 2017-05-01 00:00:00 
     end_date: null 
     uniqueId: <unique-string-abc> 
    1: 
     id: 2 
     start_date: 2017-04-01 00:00:00 
     end_date: 2017-05-02 00:00:00 
     uniqueId: <unique-string-cde> 
    2: 
     id: 3 
     start_date: 2017-05-01 10:00:00 
     end_date: null 
     uniqueId: <unique-string-def> 

localCollection 
    0: 
     id: 1 
     start_date: 2017-05-01 00:00:00 
     end_date: null 
     uniqueId: <unique-string-abc> 
    1: 
     id: 2 
     start_date: 2017-04-01 00:00:00 
     end_date: null 
     uniqueId: <unique-string-cde> 

Im obigen Beispiel hat id 2 aktualisiert und id 3 ist neu vom downloadedCollection.

Was ist der ideale Java-Weg, um diese beiden Sammlungen angesichts der Komplexität der Operation zu vergleichen? Java SDK 7.

+2

Im Allgemeinen versuchen Sie nicht, die Daten zu vergleichen, um festzustellen, was sich geändert hat. Stattdessen legen Sie ein "schmutziges" Flag fest, wenn Sie etwas ändern, damit ein Verwaltungssystem weiß, was zu sehen ist. – azurefrog

+2

Wenn Sie die Operation wie beschrieben ausführen müssen, können Sie eine anständige Methode 'hashCode()' für die Member-Objekte und eine entsprechende 'equals()' Methode implementieren. Erstellen Sie dann ein 'HashSet', das die Elemente der neu heruntergeladenen Liste enthält, und' removeAll() 'die Elemente der Referenzliste. Welche Elemente auch immer bleiben, sind neu oder unterscheiden sich von der Referenzliste in dem Sinne, der durch die 'equals()' Methoden der Mitglieder definiert wird. –

+0

@azurefrog Da dies von einem REST-Dienst heruntergeladen wird, kann nicht wirklich erwartet werden, dass der Dienst weiß, was auf dem Client fehlerhaft ist. Unter der Annahme, dass der Client tatsächlich wissen muss, was sich geändert hat (anstatt einfach nur die neuesten Daten aus dem Service zu verwenden), ist die Lösung von JohnBollinger ziemlich gut. –

Antwort

0

Lassen Sie eine Hash-Tabelle die ID (Schlüssel) und Ablaufinfo (Wert) @ local erhalten. Wann immer Sie neue Ventile erhalten, durchlaufen Sie sie und aktualisieren Sie Ihr Repository und Ihre Hash-Tabelle. Dies wird ausgeführt O (n), wo n ist die noof Elemente in der neuen Liste.

Verwandte Themen