首页 > 解决方案 > java中的交叉地图与另一个地图

问题描述

我有一张地图:

 private Map<String, Map<String, ArrayList<String>>> map1; 

其中地图包含:

 ArrayList<String> is a list with values like : "A, B, C, .."
 Map<String, ArrayList<String>> -> Here the key is: LINEA, PARCIAL, TOTAL
 Map<String, Map<String, ArrayList<String>>> the key is: "B,D,F, ..." // similar 

地图的值1

 {
 "map1":
     {
        "A": {  //key
            "LINEA": //key internal map
                ["B", "C", "D", "E", "F", "G"] //List
        },
        "H": { //key
            "LINEA":  //key internal map
                ["H", "I", "B", "C", "J", "A"] //List
        },
        "I": {
            "LINEA": 
                ["I", "H", "B", "C", "J", "A"]
        },
        "D": {
            "LINEA": 
                ["D", "G", "E", "F", "J", "A", "K"]
        },
        "K": {
            "LINEA": 
                ["D", "E", "F", "G"]
        },
        "C": { //key
            "LINEA":  //key internal map
                ["J", "A"],
            "PARCIAL":  //List
                ["J", "A"], //Listmap
            "TOTAL":  //key internal map
                ["J", "A"] //List
        },
        "B": {
            "PARCIAL": 
                ["B", "H", "I", "C", "J", "A"]
        },
        "E": {
            "PARCIAL": 
                ["E", "G", "F", "J", "A", "K"],
            "TOTAL": 
                ["D", "G", "F", "J", "A", "K"]
        },
        "F": {
            "TOTAL": 
                ["F", "D"],
            "PARCIAL": 
                ["K"]
        }
    }
}

我还有另一张地图:

 Map<String,List<String>> map2;

地图包含:

List<String> is a list with values like: 1, 2, 3, 4
   Map<String,List<String>> key is : "A,C,D,H,..."  // similar values of map1 

列表和键

{
    "map2": {
        "A": [1, 2, 3, 4],
        "F": [1, 2, 4],
        "D": [2,6]
        "K": [7,8,9]
    }
}

我需要穿越地图:

我需要将 map1 中的“A、B、C、E、...”值替换为 map2 中的值。

结果如下:

"map1":
     {
        "1": {  //reeplace by F
            "LINEA": //key internal map
                [1, 4, 2, 6], // REEMPLACE BY ["F", "D"] because is the partial list of F in map1,  F = [1, 2, 4] , D = [2,6]
        },
        "1": { //reeplace by F
            "PARCIAL":  //key internal map 
                [7,8,9] // REEMPLACE BY ["K"] 
        },

        .
        .
        .

我有一个 4 的解决方案。但我不知道是否嵌套4次是不好的做法。

谁能帮我解决这个问题。

标签: javafor-loopmaps

解决方案


四个嵌套循环是“需要重构”的好信号。
忽略映射键的转换,这对我来说不是很清楚,并假设map1map2给出静态字段,将值重新映射到newMap可以通过以下方式实现:

Map<String, Map<String, ArrayList<String>>> newMap = new HashMap<>();
    for(String key : map1.keySet() ) {
        newMap.put(convertKey(key), convertEntry(key));
    }
}

其中convertKeyconvertEntry定义为

private static String convertKey(String key) {
    // TODO add key conversion logic 
    return key;
}

private static Map<String, ArrayList<String>> convertEntry(String key) {

    Map<String, ArrayList<String>> map = map1.get(key);
    Map<String, ArrayList<String>> returnedMap = new HashMap<>();

    for(String keyOfInnerMap : map.keySet()) {
        ArrayList<String> newValues = mapValues(map.get(keyOfInnerMap));
        returnedMap.put(keyOfInnerMap, newValues);
    }

    return returnedMap;
}

private static ArrayList<String> mapValues(ArrayList<String> values) {

    Set<String> newValues = new HashSet<>();
    for(String key : values) {

        List<String> v = map2.get(key);
        if(v != null) {
            newValues.addAll(v);
        }
    }

    return new ArrayList<>(newValues);
}

推荐阅读