membersound
membersound

Reputation: 86747

Comparing two hashmaps for equal values and same key sets?

How can I best compare two HashMaps, if I want to find out if none of them contains different keys than the other, and if the values of that keys match each other.

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

When comparing A with B, it should fail due to different keys B and D.

How could I best compare non-sorted hashmaps?

Upvotes: 47

Views: 185809

Answers (7)

Jonas Freire
Jonas Freire

Reputation: 315

A simple and good algorithm for such a comparison could be:

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

Simply you'll have to compare the set of keys, if they are equal, then compare the values for each key on both maps.

Upvotes: 0

Swati
Swati

Reputation: 11

if you have two maps lets say map1 and map2 then using java8 Streams,we can compare maps using code below.But it is recommended to use equals rather then != or ==

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

Upvotes: 0

Haroon Rawat
Haroon Rawat

Reputation: 51

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

Upvotes: 3

Antonio Ortells
Antonio Ortells

Reputation: 337

Compare every key in mapB against the counterpart in mapA. Then check if there is any key in mapA not existing in 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;
}

Upvotes: 11

SanA
SanA

Reputation: 129

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;
}

Upvotes: 0

user2336315
user2336315

Reputation: 16067

Simply use :

mapA.equals(mapB);

Compares the specified object with this map for equality. Returns true if the given object is also a map and the two maps represent the same mappings

Upvotes: 77

Narendra Pathai
Narendra Pathai

Reputation: 41945

Make an equals check on the keySet() of both HashMaps.

NOTE:

If your Map contains String keys then it is no problem, but if your Map contains objA type keys then you need to make sure that your class objA implements equals().

Upvotes: 34

Related Questions