我有一张地图:
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次是一个坏习惯。
谁可以帮助我为这个问题提供一个好的解决方案。
答案 0 :(得分:1)
四个嵌套循环是“需要重构”的一个好信号。
忽略映射键的转换(我不清楚),并假设map1
和map2
是静态字段,可以通过以下方式将值重新映射到newMap
中:
Map<String, Map<String, ArrayList<String>>> newMap = new HashMap<>();
for(String key : map1.keySet() ) {
newMap.put(convertKey(key), convertEntry(key));
}
}
convertKey
和convertEntry
由
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);
}