比较字符串映射和对象映射

时间:2019-04-29 14:51:11

标签: java hashmap

我有一个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);

现在我需要在map1map2中找到所有对应的匹配项。

示例:如果我从map1取一个条目,它将是字符串string(a, StrValue)。 然后在映射2中找到该输入键,并通过转换相应的类型比较这两个值。并重复此课程,直到map1元素完成,并且最终结果应该是:如果map1中的任何值与map2值都不匹配,请忽略此结果;如果所有值都匹配,那么我需要执行一些更新来存储map<String, Object>对象进入数据库。

我将实时拥有List<Map<String,Object>。我需要过滤map<String, Object>中的所有匹配值。

是否有更好的设计或方法来解决此问题。

1 个答案:

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