2014-01-07 19 views
17

Wie kann ich zwei HashMap s am besten vergleichen, wenn ich herausfinden will, ob keiner von ihnen andere Schlüssel als der andere enthält und ob die Werte dieser Schlüssel zueinander passen.Vergleich zweier Hashmaps für gleiche Werte und gleiche Schlüsselsätze?

Map<objA, objB> mapA = new HashMap<objA, objB>(); 
mapA.put("A", "1"); 
mapA.put("B", "2"); 

Map<objA, objB> mapB = new HashMap<objA, objB>(); 
mapB.put("D", "4"); 
mapB.put("A", "1"); 

Wenn A mit B zu vergleichen, sollte es wegen der verschiedenen Tasten B und D. scheitern

Wie konnte ich nicht sortierten Hashmaps besten vergleichen?

Antwort

16

Machen Sie eine equals überprüfen Sie die keySet() von beiden HashMap s.

HINWEIS:

Wenn Ihr Map enthält String Schlüssel dann ist es kein Problem, aber wenn Sie Ihre Karte objA Typ Schlüssel enthält, dann müssen Sie sicherstellen, dass Ihre Klasse objAequals() implementiert.

+7

Ja, aber der OP will auch, dass sie die gleiche Zuordnung haben. Beachten Sie, dass Sie HashCode ebenfalls überschreiben müssen. – user2336315

+0

Vergessen Sie nicht, 'hashCode()' zu überschreiben, wenn Sie '.equals()' überschreiben, wie der Typ sagte –

27

einfach verwenden:

mapA.equals(mapB);

Vergleicht das angegebene Objekt mit dieser Karte für die Gleichstellung. Gibt true zurück , ob das angegebene Objekt ist auch eine Karte und die beiden Karten repräsentieren den gleich Mappings

+0

Ist dies für Java oder Android? Unter Android lautet die Beschreibung für "equals" [different] (http://stackoverflow.com/a/29431623/145173). –

+0

@EdwardBrey Die Beschreibung, die Sie angeben, macht dasselbe. Und ich weiß nicht, wo Sie diese Definition haben, denn es ist das gleiche auf dem Android-Dokument: http://developer.android.com/reference/java/util/Map.html#equals(java.lang.Object) – user2336315

+0

Die Dokumentation für die Schnittstellenmethode [Map.equals] (http://developer.android.com/reference/java/util/Map.html#equals (java.lang.Object)) ist wie Sie angegeben haben. HashMap implementiert jedoch die 'equals'-Methode dieser Schnittstelle über [AbstractMap.equals] (http://developer.android.com/reference/java/util/AbstractMap.html#equals (java.lang.Object)) , die die schwächere Garantie hat, die ich zitiert habe. Der 'AbstractMap' Code entspricht seiner Dokumentation. Es scheint mir, dass HashMap den Vertrag der Schnittstelle verletzt. –

8

jeden Schlüssel in mapB gegen das Gegenstück in MAPA vergleichen. Prüfen Sie dann, ob es einen Schlüssel in MAPA ist nicht in mapB bestehenden

public boolean mapsAreEqual(Map<String, String> mapA, Map<String, String> mapB) { 

    try{ 
     for (String k : mapB.keySet()) 
     { 
      if (!mapA.get(k).equals(mapB.get(k))) { 
       return false; 
      } 
     } 
     for (String y : mapA.keySet()) 
     { 
      if (!mapB.containsKey(y)) { 
       return false; 
      } 
     } 
    } catch (NullPointerException np) { 
     return false; 
    } 
    return true; 
} 
+0

Dies funktioniert nicht, wenn Sie Nullwerte in Ihrer Map haben. Bei den folgenden zwei Maps wird der Vergleich fehlschlagen: final Map map1 = new HashMap <>(); \t \t map1.put ("key1", neu Double (0.0)); \t \t map1.put ("key2", neu Double (75.0)); \t \t map1.put ("key3", null); \t \t final Karte map2 = neue HashMap <>(); \t \t map2.put ("Schlüssel1", Doppel.WertOf ("0.0")); \t \t map2.put ("key2", 75.0); \t \t map2.put ("key3", null); –

0
public boolean compareMap(Map<String, String> map1, Map<String, String> map2) { 

    if (map1 == null || map2 == null) 
     return false; 

    for (String ch1 : map1.keySet()) { 
     if (!map1.get(ch1).equalsIgnoreCase(map2.get(ch1))) 
      return false; 

    } 
    for (String ch2 : map2.keySet()) { 
     if (!map2.get(ch2).equalsIgnoreCase(map1.get(ch2))) 
      return false; 

    } 

    return true; 
} 
-3
private static int comparingTwoHashMap(Map<String, String> mapA, Map<String, String> mapB) { 
    if (mapA != null && mapB != null && mapA.size() == mapB.size()) { 
     for (Map.Entry m : mapA.entrySet()) { 
      String keyFromFirstMap = (String) m.getKey(); 
      String valueFromFirstMap = (String) m.getValue(); 
      String valueFromSecondMap = mapB.get(keyFromFirstMap); 

      if (!valueFromFirstMap.equals(valueFromSecondMap)) { 
       return 0; 
      } 
     } 
     return 1; 
    } 
    else { 
     return 0; 
    } 
} 
+3

Sehr schlechter Qualitätscode und beantwortet die Frage nicht wirklich. Keine gute Antwort. – pczeus

0
/* JAVA 8 using streams*/ 
    public static void main(String args[]) 
    { 
     Map<Integer, Boolean> map = new HashMap<Integer, Boolean>(); 
     map.put(100, true); 
     map.put(1011, false); 
     map.put(1022, false); 

     Map<Integer, Boolean> map1 = new HashMap<Integer, Boolean>(); 
     map1.put(100, false); 
     map1.put(101, false); 
     map1.put(102, false); 

     boolean b = map.entrySet().stream().filter(value -> map1.entrySet().stream().anyMatch(value1 -> (value1.getKey() == value.getKey() && value1.getValue() == value.getValue()))).findAny().isPresent(); 
     System.out.println(b); 
    } 
Verwandte Themen