在Java中与另一个地图交叉地图

时间:2018-08-10 23:53:17

标签: java for-loop maps

我有一张地图:

 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 

map1的值

 {
 "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次是一个坏习惯。

谁可以帮助我为这个问题提供一个好的解决方案。

1 个答案:

答案 0 :(得分:1)

四个嵌套循环是“需要重构”的一个好信号。
忽略映射键的转换(我不清楚),并假设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);
}