Comment puis-je comparer au mieux deux HashMap
s, 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?
Effectuez une vérification equals
sur la keySet()
des deux HashMap
s.
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()
.
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;
}
/* 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;
}
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);