2016-06-24 11 views
4

Ich habe zwei Karten wie folgt:Wie bekomme ich den Unterschied zwischen zwei Karten Java?

Map<String, Record> sourceRecords; 
Map<String, Record> targetRecords; 

ich die Schlüssel unterscheiden sich von jedem der maps.i.e. erhalten möchten

  1. Es zeigt die Zuordnungsschlüssel in sourceRecords, aber nicht in targetRecords.
  2. Es zeigt Zuordnungsschlüssel in targetRecords, aber nicht in sourceRecords.

Ich habe es wie folgt: aber nicht eindeutige Schlüssel

Set<String> sourceKeysList = new HashSet<String>(sourceRecords.keySet()); 
Set<String> targetKeysList = new HashSet<String>(targetRecords.keySet()); 

SetView<String> intersection = Sets.intersection(sourceKeysList, targetKeysList); 
Iterator it = intersection.iterator(); 
while (it.hasNext()) { 
    Object object = (Object) it.next(); 
    System.out.println(object.toString()); 
} 

SetView<String> difference = Sets.symmetricDifference(sourceKeysList, targetKeysList); 
ImmutableSet<String> immutableSet = difference.immutableCopy(); 

EDIT

if(sourceKeysList.removeAll(targetKeysList)){ 
      //distinct sourceKeys 
      Iterator<String> it1 = sourceKeysList.iterator(); 
      while (it1.hasNext()) { 
       String id = (String) it1.next(); 
       String resultMessage = "This ID exists in source file but not in target file"; 
       System.out.println(resultMessage); 
       values = createMessageRow(id, resultMessage); 
       result.add(values); 
      } 
     } 
     if(targetKeysList.removeAll(sourceKeysList)){ 
      //distinct targetKeys 
      Iterator<String> it1 = targetKeysList.iterator(); 
      while (it1.hasNext()) { 
       String id = (String) it1.next(); 
       String resultMessage = "This ID exists in target file but not in source file"; 
       System.out.println(resultMessage); 
       values = createMessageRow(id, resultMessage); 
       result.add(values); 
      } 
     } 

ich in der Lage bin, die gemeinsamen Schlüssel zu finden. Bitte helfen Sie.

+0

Suchen Sie nach Guavas 'Sets.symmetricDifference (source.keySet(), target.keySet())'? – blubb

Antwort

3

Sets können Sie auch entfernen Elemente.

Wenn Erzeugung von "Helfer" stellt kein Problem für Sie (wegen zu vieler Einträge, was ist:

Set<String> sources = get a copy of all source entries 
Set<String> targets = get a copy of all source entries 

dann:

sources.removeAll(targets) ... leaves only entries in sources that are only in sources, not in target 

während

sources.retainAll(targets) ... leaves only entries that are in both sets 

Sie können Ihren Weg von hier aus arbeiten ...

+0

set1.retainAll (set2) stellt die Zuordnungsschlüssel in beiden Sets zur Verfügung. Aber für set1.removeAll (set2) entfernt es die Schlüssel, die in set2 von set1 sind. Ich möchte den gleichen Weg auch für set2 machen. – Robot

+0

Und was verhindert, dass Sie das umgekehrte "Entfernen" auf set2 tun? – GhostCat

+0

Ich habe das gleiche angewandt, siehe die bearbeitete Frage, aber löste mein Problem nicht – Robot

4

Sie können eine Kopie Set und removeAll verwenden:

Set<String> difference = new HashSet<String>(sourceKeysList); 
difference.removeAll(targetKeysList); 

The Set Interface

0
  1. Siehe Es zeigt Kartierschlüssel in sourceRecords aber nicht in targetRecords.

sourceKeysList.removeAll(targetKeysList)

  1. Es zeigt Kartierschlüssel in targetRecords aber nicht in sourceRecords.

targetKeysList.removeAll(sourceKeysList)

+0

Der obige Code gibt nur den Unterschied in targetKeyList aus, aber nicht in sourceKeyList. Bearbeiten der Frage gemäß den Anweisungen, angewendet, aber löste nicht mein Problem. – Robot

5

Sie können Guava ‚s Maps.difference(Map<K, V> left, Map<K, V> right) Methode verwenden.Es gibt ein MapDifference Objekt, das Methoden, um alle vier Arten von Map-Einträge hat:

  • gleichermaßen in linken und rechten Karte
  • nur in der linken Karte
  • nur in der rechten Karte
  • Schlüssel vorhanden in beiden Karten, aber unterschiedliche Werte mit

Also in Ihrem Fall könnte es mit nur 3 Zeilen Code gelöst werden:

MapDifference<String, Record> diff = Maps.difference(sourceRecords, targetRecords); 
Set<String> keysOnlyInSource = diff.entriesOnlyOnLeft().keySet(); 
Set<String> keysOnlyInTarget = diff.entriesOnlyOnRight().keySet(); 
+0

So erhalten Sie die Differenz für verschachtelte Werte, zum Beispiel {val1: {val2: {val3: 1, val3: 2}}} und {val1: {val2: {val3: 5, val3: 2}}}, Hier, Der Unterschied liegt bei val3 und seine Hierarchie ist val1: val2: val3. – pjain

+1

@PriyalJain Das sollte als eigene Frage gestellt werden, bitte [ask]. –

+0

Ich weiß wirklich nicht, wie dieser ganze stackoverflow funktioniert:/ wenn ich fragte ppl wählte es sagt es ist nicht die richtige Frage und ich sollte es nehmen, wenn ich hier fragte Sie vorschlagen, es als separate Frage zu machen – pjain