java - 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次是不好的做法。
谁能帮我解决这个问题。
解决方案
四个嵌套循环是“需要重构”的好信号。
忽略映射键的转换,这对我来说不是很清楚,并假设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);
}
推荐阅读
- regex - 基于目录匹配的 Apache 重定向 & 向目标 URL 添加另一个字母
- java - 诊断和修复平台相关的 Java Runtime.exec 静默故障
- javascript - Leaflet Tag Filter Button and MarkerCluster.LayerSupport Plugins - 集成以在点击时更新集群的过滤器
- .net - 更改 web.config 文件中的 allowDefinition 属性
- python-3.x - 将日期时间类型的数组分配给熊猫数据框
- java - Talend - 在“yyyy-MM-dd”中转换“EEE MMM dd hh:mm:ss z yyyy”
- c# - Azure 上 Windows VM 上的套接字服务器停止侦听传入请求
- jquery - CSS 变换导致 Safari 上的 FancyBox 3 出现渲染错误
- git - Gitflow在发布后在master后面开发分支
- android - Kotlin 适用于 String 未按预期工作