2017-10-31 17 views
0

Ich habe zwei Karten aktuelle und vorherige und ich möchte sehen, ob es einen Unterschied zwischen den 2 Karten gibt. Wenn entweder ein neuer Schlüssel in der aktuellen Karte vorhanden ist oder wenn die Werte für denselben Schlüssel unterschiedlich sind, kann ich anhalten.Finden Sie die Unterschiede zwischen zwei Karten

Map<String, String> previousValue; 
Map<String, String> currValue; 

boolean isChangePresent = currValue.entrySet().stream().anyMatch(
        x -> !previousValue.containsKey(x.getKey()) || 
         (previousValue.get(x.getKey()) != null && !previousValue.get(x.getKey()).equals(
          x.getValue()))); 

Gibt es einen besseren Weg, dies zu tun, oder eine eingebaute Utility-Funktion, die etwas in der Art tut?

+2

Was mit 'previousValue.equals (currValue) falsch'? –

+1

@AndyTurner tut es nicht, was das OP zu fragen scheint: d. H., Dass alle Einträge von currValue in previousValue enthalten sind. d. h. 'previousValue.entrySet(). containsAll (currValue.entrySet())' –

Antwort

3

Da Ihr Schlüssel und Wert ist nur Strings, ihre .equals() Methode prüft die logische Gleichheit (anstatt zu prüfen, wenn sie die gleiche Speicheradresse haben), so dass Sie einfach

können
boolean check(Map<String, String> a, Map<String, String> b) { 
    return a.equals(b); 
} 

Nur vorsichtig sein, denn wenn Sie haben zum Beispiel zwei Karten des Typs Map<K,V>, wobei V.equals() Methode nicht überschrieben hat, und die Standardmethode equals V überprüft nicht auf logische Gleichheit, dann wird es nicht funktionieren.

Edit:

bei Ihrer Benennung sorgfältig mehr Sehen, halten Sie für eine Änderung anwesend sein, wenn die keySet von previousMap enthält alle Schlüssel von currentMapabercurrentMap weniger Tasten als previousMap hat? Wenn Sie sie betrachten keine Änderung dann sein, was Sie tun müssen, ist

boolean check(Map<String, String> previous, Map<String, String> current) { 
     Map<String,String> copyOfPrev = new HashMap<>(); 
     previous.forEach((k,v) -> copyOfPrev.put(k,v)); 
     copyofPrev.keySet().retainAll(current.keySet()); 
     return copyOfPrev.equals(current); 
    } 

unter Berücksichtigung, dass Map<K, V>#keySet().retainAll(Collection<K> c) die darunter liegende Karte modifiziert, so dass die tiefe Kopie ist Änderungen an die vorherige Karte zu verhindern. Wenn Sie mit dem Ändern der vorherigen Karte einverstanden sind, können Sie einfach die ersten drei Zeilen des Hauptteils dieser Methode löschen und copyOfPrev in previous ändern.

+1

Warum nicht einfach 'previousValue.entrySet() verwenden. containsAll (currValue.entrySet())'? –

+0

@JBNizet Ja, das ist ein besserer Weg, ich habe nicht realisiert, dass du entrySet gesetzt hast. Mein Vorschlag ist eine manuelle Vorgehensweise, um das zu tun, was Sie vorgeschlagen haben. Obwohl mir etwas sagt, dass OP eigentlich nur prüfen will, ob die Karten gleich sind, aber der Wortlaut deutet darauf hin, was Sie hier erwähnt haben. – Blake

Verwandte Themen