一、问题描述
判断两个map是否相同,相同返回true,反之返回false。
二、情况分析
map存在map==null,map为空,map的key为null,map的value为null这四种情况,比较时需要将所有情况考虑在内。
三、方法代码
下面是比较两map的函数方法。
public static Boolean mapCompare(Map<String,Object> map1,Map<String,Object> map2) {
try {
// map为null
if(map1 == null && map2 == null){
return true;
} else if (map1 == null || map2 == null) {
return false;
}
// map不为空
if (map1.size() != map2.size()) {
return false;
}
for(Object k:map1.keySet()) {
if(!map2.containsKey(k)){
return false;
}
// 如果map1.value为null或map2.value为null
if (map1.get(k) == null || map2.get(k) == null) {
boolean t = (map1.get(k) == null);
// (v为null且map2.value不为null)或者(v不为null且map2.value为null)
if ((map1.get(k)== null && map2.get(k)!= null) || (map1.get(k) != null && map2.get(k) == null) ){
return false;
}
} else if (!map1.get(k).equals(map2.get(k))) { // map1和map2的value都不为null,判断其是否相等
return false;
}
}
return true;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Map元素比对异常:", e.getCause());
}
}
四、测试方法
public static void main(String[] args) {
Map<String,Object> map = new HashMap<>();
Map<String,Object> map1 = new HashMap<>();
Map<String,Object> map2 = new HashMap<>();
Map<String,Object> map3 = null;
Map<String,Object> map4 = null;
Map<String,Object> map5 = new HashMap<>();
Map<String,Object> map6 = new HashMap<>();
Map<String,Object> map7 = new HashMap<>();
Map<String,Object> map8 = new HashMap<>();
map.put("a",2342);
map.put("ab","null");
// map.put(null,"2342");
// System.out.println(map);
map1.put("a",2342);
map1.put("ab",null);
// map1.put("null","2342");
System.out.println(map1);
map2.put("a",2342);
map2.put("1",null);
map7.put(null,2342);
map7.put("ab","null");
// map.put(null,"2342");
// System.out.println(map);
map8.put("a",2342);
map8.put("ab","null");
// System.out.println(map2);
// System.out.println(mapCompare(map1,map)); // true
//
// System.out.println(mapCompare(map,map2)); // true
// System.out.println(mapCompare(map2,map)); // true
//
// System.out.println(mapCompare(map2,map1)); // true
// System.out.println(mapCompare(map1,map2)); // true
// System.out.println(mapCompare(map3,map4)); // 都为null, true
// System.out.println(mapCompare(map1,map4)); // 一个为null, false
// System.out.println(mapCompare(map5,map6)); // 都为空,true
// System.out.println(mapCompare(map1,map6)); // 一个为空,false
// System.out.println(mapCompare(map6,map1)); // 一个为空,false
// System.out.println(mapCompare(map,map1)); // 不为null且不为空,长度不等,false
// System.out.println(mapCompare(map,map1)); // 不为null且不为空,长度相等,map2相同k对应的v为null,false
// System.out.println(mapCompare(map1,map2)); // 不为null且不为空,长度相等,map1中的k在2中不存在,false
// System.out.println(mapCompare(map7,map8)); // 不为null且不为空,长度相等,map1中的k为null
}
测试了很多次,目前还没发现有不能覆盖的情况,至此记录一下。
如果有没考虑到的情况还请指出。