Сравнение карты строк с картой объектов - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть Map<String,String> объект, а также Map<String,Object> один.

Теперь мне нужно выбрать запись из Map<String,String>, найти эту запись в Map<String,Object>, узнать тип данных для значения и преобразовать значение записи Map<string, String> в соответствующий соответствующий тип данных в Map<String, Object и сравните эти 2 значения.

Например:

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> объект в DB.

В режиме реального времени у меня будет List<Map<String,Object>. Мне нужно отфильтровать все соответствующие значения в map<String, Object>.

Есть ли лучший дизайн или подход для решения этой проблемы.

1 Ответ

1 голос
/ 29 апреля 2019

У меня такое ощущение, что эти две карты не соответствуют структуре данных; это больше похоже на создание собственной системы типов. Однако вот подход:

Взятие 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...