web-dev-qa-db-fra.com

Comparer deux hashmaps pour des valeurs égales et les mêmes jeux de clés?

Comment puis-je comparer au mieux deux HashMaps, si je veux savoir si aucune d'entre elles ne contient une clé différente de l'autre, et si les valeurs de cette clé correspondent?.

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

Lors de la comparaison de A avec B, cela devrait échouer à cause des clés différentes B et D.

Comment comparer au mieux les hashmaps non triés?

26
membersound

Effectuez une vérification equals sur la keySet() des deux HashMaps.

REMARQUE:

Si votre Map contient des clés String, alors ce n'est pas un problème, mais si votre carte contient des clés de type objA, vous devez vous assurer que votre classe objA implémente equals().

25
Narendra Pathai

Comparez chaque clé de mapB à la contrepartie de mapA. Puis vérifiez s'il y a une clé dans mapA qui n'existe pas dans 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;
}
9
Antonio Ortells
/* 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);
    }
1
Haroon Rawat
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;
}
0
SanA

si vous avez deux cartes, disons map1 et map2 puis en utilisant Java8 Streams, nous pouvons comparer les cartes en utilisant le code ci-dessous. Mais il est recommandé d'utiliser égal à alors! 

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