簡體   English   中英

比較兩個哈希映射的相等值和相同的鍵集?

[英]Comparing two hashmaps for equal values and same key sets?

我怎樣才能最好地比較兩個HashMap s,如果我想知道它們是否包含與另一個不同的鍵,以及這些鍵的值是否相互匹配。

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

將 A 與 B 進行比較時,由於密鑰 B 和 D 不同,應該會失敗。

我怎樣才能最好地比較未排序的哈希圖?

只需使用:

mapA.equals(mapB);

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

對兩個HashMapkeySet()進行equals檢查。

注意:

如果您的Map包含String鍵,那么沒問題,但如果您的Map包含objA類型鍵,那么您需要確保您的類objA實現equals()

將mapB中的每個鍵與mapA中的對應鍵進行比較。 然后檢查mapB中是否存在mapA中沒有任何鍵

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;
}
/* 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);
    }
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;
}

如果你有兩個地圖讓我們說map1和map2然后使用java8 Streams,我們可以使用下面的代碼比較地圖。但是建議使用equals而不是!=或==

boolean b = map1.entrySet().stream().filter(value -> 
            map2.entrySet().stream().anyMatch(value1 -> 
            (value1.getKey().equals(value.getKey()) && 
  value1.getValue().equals(value.getValue())))).findAny().isPresent();   


System.out.println("comparison  "+b);

這種比較的一個簡單而好的算法可能是:

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

    Map<Integer, Boolean> map2 = new HashMap<Integer, Boolean>();
    map2.put(100, false);
    map2.put(1011, false);
    map2.put(1022, false);

    if (!map1.keySet().equals(map2.keySet())) {
        result = false;
    } else {
        result = map1.keySet()
                .stream()
                .allMatch(key -> map1.get(key).equals(map2.get(key)));
    }

只需比較鍵集,如果它們相等,則比較兩個地圖上每個鍵的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM