Получить значение из списка <Map>и вставить его в другой список <Map> - PullRequest
0 голосов
/ 29 марта 2019

Мне нужно изменить формат List

> на другой формат List
>.У меня есть эта коллекция:

[{
    "OPERATION_NAME": "COPY",
    "OPERATION_STATUS": "READY",
    "COUNT(1)": 1
}, {
    "OPERATION_NAME": "ARCHIVE",
    "OPERATION_STATUS": "READY",
    "COUNT(1)": 1
}, {
    "OPERATION_NAME": "EXPORT_CA",
    "OPERATION_STATUS": "READY",
    "COUNT(1)": 1
}, {
    "OPERATION_NAME": "MERGE",
    "OPERATION_STATUS": "READY",
    "COUNT(1)": 1
}, {
    "OPERATION_NAME": "MERGE",
    "OPERATION_STATUS": "DONE",
    "COUNT(1)": 1
}]

И я изменяю ее на это:

[{
    "READY": 0,
    "NEW": 0,
    "DONE": 0,
    "OPERATION_NAME": "MERGE"
}, {
    "READY": 0,
    "NEW": 0,
    "DONE": 0,
    "OPERATION_NAME": "ARCHIVE"
}, {
    "READY": 0,
    "NEW": 0,
    "DONE": 0,
    "OPERATION_NAME": "COPY"
}, {
    "READY": 0,
    "NEW": 0,
    "DONE": 0,
    "OPERATION_NAME": "EXPORT_CA"
}]

Но мне не удается получить значение COUNT (1) и установить его нановый объект, который я создаю.

В конце у меня должно быть следующее:

[{
    "READY": 1,
    "NEW": 0,
    "DONE": 1,
    "OPERATION_NAME": "MERGE"
}, {
    "READY": 1,
    "NEW": 0,
    "DONE": 0,
    "OPERATION_NAME": "ARCHIVE"
}, {
    "READY": 1,
    "NEW": 0,
    "DONE": 0,
    "OPERATION_NAME": "COPY"
}, {
    "READY": 1,
    "NEW": 0,
    "DONE": 0,
    "OPERATION_NAME": "EXPORT_CA"
}]

Вот моя функция для преобразования объекта в другой:

private List<Map<String, Object>> transformObject(List<Map<String, Object>> resDB) {
        Gson gson = new Gson();
        LOGGER.info("Json response : {}", gson.toJson(resDB));

        List<Map<String, Object>> result = new ArrayList<>();

        List<String> listOfOperationName = new ArrayList<>();
        List<String> listOfOperationStatus = new ArrayList<>();

        // Retrieve OP Name and OP Status
        for (Map<String, Object> map : resDB) {
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                String key = entry.getKey();
                Object value = entry.getValue();
                if(key.equals("OPERATION_NAME")) {
                    listOfOperationName.add(value.toString());
                } else if(key.equals("OPERATION_STATUS")) {
                    listOfOperationStatus.add(value.toString());
                }
            }
        }

        // Remove duplicates
        Set<String> setName = new HashSet<>(listOfOperationName);
        listOfOperationName.clear();
        listOfOperationName.addAll(setName);
        // Remove duplicates
        Set<String> setStatus = new HashSet<>(listOfOperationStatus);
        listOfOperationStatus.clear();
        listOfOperationStatus.addAll(setStatus);

        // Create field OP Name with value
        for (String tempOpName : listOfOperationName) {
            Map<String, Object> tempObjName = new HashMap<>();
            tempObjName.put("OPERATION_NAME", tempOpName);
            for (String tempOpStatus : listOfOperationStatus) {
                tempObjName.put(tempOpStatus, 0);
            }
            result.add(tempObjName);
        }

        Gson gsonResult = new Gson();
        LOGGER.info("Json response : {}", gsonResult.toJson(result));

        return result;
    }

Если у вас есть идеи, как это сделать, это было бы здорово!Большое спасибо!

1 Ответ

1 голос
/ 29 марта 2019

С помощью этих двух вспомогательных методов

private static Map<String, Object> transform(Map<String, Object> initial) {
    Map<String, Object> transformed = new HashMap<>();
    transformed.put("OPERATION_NAME", (String) initial.get("OPERATION_NAME"));
    transformed.put("READY", 0);
    transformed.put("NEW", 0);
    transformed.put("DONE", 0);
    transformed.put((String) initial.get("OPERATION_STATUS"),
                    Integer.valueOf((String) initial.get("COUNT(1)")));
    return transformed;
}

private static Map<String, Object> mergeMaps(Map<String, Object> left, Map<String, Object> right) {
    for (Entry<String, Object> re : right.entrySet()) {
        if (!"OPERATION_NAME".equals(re.getKey())) {
            left.merge(re.getKey(), re.getValue(), (l, r) -> {
                Integer res = 0;
                res += (Integer) l;
                res += (Integer) r;
                return res;
            });
        }
    }
    return left;
}

вы можете легко сделать ваше преобразование

List<Map<String, Object>> output = resDB.stream().map(m -> transform(m)).collect(Collectors.collectingAndThen(
        Collectors.toMap(m -> (String) m.get("OPERATION_NAME"), Function.identity(), (l, r) -> mergeMaps(l, r)),
        m -> new ArrayList<>(m.values())));

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...