我有一个Map<String,String>
对象和一个Map<String,Object>
对象。
现在我要从Map<String,String>
中选择一个条目,然后在Map<String,Object>
中找到该条目,并找到该值的数据类型,然后将Map<string, String>
条目值转换为相应的匹配数据输入Map<String, Object
并比较这两个值。
例如:
Map map1= new HashMap<String,string>();
map.put("a","strValue");
map.put("b","10");
map.put("c","10.00");
map.put("d","true");
Map map2= new HashMap<String,Object>();
map.put("a","strValue");
map.put("b",10);
map.put("c",10.00);
map.put("d",true);
map.put("e",45);
map.put("f","SAM");
map.put("g",false);
现在我需要在map1
到map2
中找到所有对应的匹配项。
示例:如果我从map1取一个条目,它将是字符串string(a, StrValue)
。
然后在映射2中找到该输入键,并通过转换相应的类型比较这两个值。并重复此课程,直到map1元素完成,并且最终结果应该是:如果map1中的任何值与map2值都不匹配,请忽略此结果;如果所有值都匹配,那么我需要执行一些更新来存储map<String, Object>
对象进入数据库。
我将实时拥有List<Map<String,Object>
。我需要过滤map<String, Object>
中的所有匹配值。
是否有更好的设计或方法来解决此问题。
答案 0 :(得分:1)
我觉得那两个地图不是合适的数据结构;它更像是自己做类型系统。但是这里有一种方法:
不使用对象的toString来比较地图的值。
Objects.toString(10.30)
不一定是"10.3"
,很有可能不是"10.30"
。
因此,您将无法简单地使用Objects.toString(Object)
来转换所有内容,甚至将null
转换为String
然后进行比较。对于浮点,您需要精确的匹配,几乎相等的功能。
您可以对值BiPredicate<Object, String>
使用自定义测试。
private static Map<<Class<?>, BiPredicate<Object, String>> similars = new HashMap<>();
static {
similars.put(String.class, (obj, repr) -> repr.equalsIgnoreCase((String) obj));
similars.put(Integer.class, (obj, repr) -> Integer.parseInt(repr) == (Integer) obj);
similars.put(Double.class, (obj, repr) ->
Math.abs(Double.parseDouble(repr) - (Double) obj) < 0.0001);
...
}
boolean valuesAreAlmostEqual(Object value, String valueRepr) {
if (value == null) {
return valueRepr.equals("null");
}
BiPredicate<Object, String> similar = similarMap.get(value.getClass());
if (similar == null) {
throw new IllegalStateException("Uncovered value class " + value.getClass().getName());
}
return similar.test(value, valueRepr);
}