繁体   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