簡體   English   中英

如果鍵已經存在,則遞歸增加相同的嵌套映射值

[英]Recursively increase the same nested map values if keys are already exists

我的parentMap看起來像下面的東西。

HashMap<String, Integer>>> parentMap = {disabled={account={test1=22}, group={test2=10}}}

我想做的是,如果operationType=disabledobjectType=accountgroup等和testName=test1test2等,那么我想將test1的計數增加 1。

我必須更新同一個地圖,以便在年底我應該得到一些統計好像有22 tests的情況下objectType=account和10 tests案例objectType=group等被禁用

我在下面嘗試了一些東西,但是當我將值放入地圖並再次對其進行迭代時,它會進入無限循環。

private HashMap<String, HashMap<String, HashMap<String, Integer>>> countTags(String statType, String objectType,
            String opType, HashMap<String, HashMap<String, HashMap<String, Integer>>> parentMap) {
        if (!Util.isEmpty(parentMap)) {

            //created new map to avoid infinite loop here but no luck :(

            HashMap<String, HashMap<String, Integer>> objMap = new HashMap<>();
            objMap.putAll(parentMap.get(statType));

            Iterator<Entry<String, HashMap<String, Integer>>> it = objMap.entrySet().iterator();
            while (it.hasNext()) {

                Entry<String, HashMap<String, Integer>> operationEntry = it.next();
                HashMap<String, Integer> operationMap = operationEntry.getValue();
                Set<String> opKeySet = operationMap.keySet();
                Iterator<String> opIt = opKeySet.iterator();

                while (opIt.hasNext()) {
                    parentMap.put(statType, countTags(objectType, opType, operationMap));
                }
            }
        } else {
            parentMap.put(statType, countTags(objectType, opType, new HashMap<String, Integer>()));
        }
        return parentMap;
    }

    private HashMap<String, HashMap<String, Integer>> countTags(String objectType, String opType, HashMap<String, Integer> tagMap) {
        int testRepeatCount = tagMap.get(opType) != null ? tagMap.get(opType) : 0;
        tagMap.put(opType, 1 + testRepeatCount);
        HashMap<String, HashMap<String, Integer>> objMap = new HashMap<>();
        objMap.put(objectType, tagMap);
        return objMap;
    }

我發現a.compute(key, (k, v) -> v == null ? 1 : v + 1); 這里還有一些建議Java map.get(key) - 如果 key 不存在,自動執行 put(key) 並返回? 但是我可以得到一些幫助,我應該如何以最佳方式實現我想要的結果嗎?

我終於擺脫了自己的if_else混亂。 這就是我的最終方法的樣子。 這幫助我在這里Java 將 `HashMap` 值附加到現有的 HashMap 如果鍵匹配

private HashMap<String, HashMap<String, HashMap<String, Integer>>> countTags(String statType, String objectType,
        String opType, HashMap<String, HashMap<String, HashMap<String, Integer>>> parentMap) {
    if (!Util.isEmpty(parentMap) && parentMap.containsKey(statType)) {
        // if objType is present, count the tags
        if (parentMap.get(statType).containsKey(objectType)) {
            HashMap<String, Integer> objMap = parentMap.get(statType).get(objectType);
            HashMap<String, Integer> map = countTags(objectType, opType, objMap).get(objectType);
            parentMap.get(statType).get(objectType).putAll(map);
        } else {
            // if objType isn't present, add that objType and count the tags
            HashMap<String, HashMap<String, Integer>> map = countTags(objectType, opType,
                    new HashMap<String, Integer>());
            parentMap.get(statType).put(objectType, map.get(objectType));
        }
    } else {
        // first time add the new tag to calculate it's object/operation wise
        // distribution
        parentMap.put(statType, countTags(objectType, opType, new HashMap<String, Integer>()));
    }
    return parentMap;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM