2014-01-07 71 views
17

如果我想知道它們是否都不包含不同於其他鍵的鍵,並且這些鍵的值是否相互匹配,我怎樣才能最好地比較兩個HashMap比較兩個hashmaps的等值和相同的鍵集?

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"); 

當爲B比較A,它應該會由於不同的密鑰B和D.

我能怎樣比較非分類包含HashMap?

回答

16

HashMap s的keySet()進行equals檢查。

注:

如果您Map包含String鍵那麼它是沒有問題的,但如果你的地圖包含objA型鍵,那麼你需要確保你的objA類實現equals()

+7

是任意鍵,但OP也希望他們有相同的映射。並且請注意,您還需要重寫hashCode。 – user2336315

+0

如果你重載'.equals()',那麼你是否忘記重寫'hashCode()'? –

27

只需使用:

mapA.equals(mapB);

比較指定對象與此映射的相等。返回true 如果給定對象也是一個映射並且兩個映射表示相同 映射

+0

這是Java還是Android?在Android上,「equals」的描述是[不同](http://stackoverflow.com/a/29431623/145173)。 –

+0

@EdwardBrey你所描述的描述是一樣的。我不知道你在哪裏得到這個定義,因爲它在Android文檔中是一樣的:http://developer.android.com/reference/java/util/Map.html#equals(java.lang.Object) – user2336315

+0

The接口方法[Map.equals](http://developer.android.com/reference/java/util/Map.html#equals(java.lang.Object))的文檔與您所引用的一樣。然而,'HashMap'通過[AbstractMap.equals]實現了該接口的equals方法(http://developer.android.com/reference/java/util/AbstractMap.html#equals(java.lang.Object)) ,這是我引用的較弱保證。 'AbstractMap'代碼與其文檔相匹配。在我看來,'HashMap'違反了界面的合約。 –

8

比較mapB針對地圖對應每一個關鍵。然後檢查是否有在地圖中mapB

不存在
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

如果地圖中有空值,這不起作用。給定以下兩個映射,它將無法進行比較: final Map map1 = new HashMap <>(); \t \t map1.put(「key1」,new Double(0.0)); \t \t map1.put(「key2」,new Double(75.0)); \t \t map1.put(「key3」,null); \t \t final Map map2 = new HashMap <>(); \t \t map2.put(「key1」,Double.valueOf(「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

質量很差的代碼,並沒有真正回答這個問題。不是一個好的答案。 – 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); 
    }