java - 根据分隔符拆分字符串并根据分隔符的计数转换为 n 级 Pair of Pair
问题描述
有一个哈希图,下面是要求:
Map<String, Object> objectmetainfo = new HashMap();
objectmetainfo.put("userdetails.info.metadata.user.home.address.details", "address");
objectmetainfo.put("userdetails.info.metadata.user.id", "id");
objectmetainfo.put("userdetails.info.metadata.userSupervisor.id", "id");
objectmetainfo.put("info.metadata.code", "code");
objectmetainfo.put("zip", "zip");
- 获取hashmap的所有记录并迭代
- 根据分隔符拆分 Key 并将其转换为 Pair 或 Hashmap
- 每个字符串的分隔符数量会有所不同
下面应该是输出:
E.g.: For "userdetails.info.metadata.user.home.address.details", "address", below output is required
HashMap<userdetails, HashMap<info, HashMap<metadata, HashMap<user, HashMap<home, HashMap<address, Map<details, address>>>>>>>
or Pair<String, Object> pair = new Pair("userdetails", new Pair("info", new Pair("metadata", new Pair("user", new Pair("home", new Pair("address", new Pair("details", "addressvalue")))))));
解决方案
假设你的字符串不会太长,这会起作用,否则你会得到一个 StackOverflow 错误。l
我使用递归方法做到了这一点
- 用“.”分割键
- 将它们转换为列表迭代器
- 递归迭代此列表以创建嵌套映射
- 在递归结束时将值从
objectmetainfo
映射中。 - 创建一个空的结果映射并递归合并所有结果。
代码:
import java.util.*;
public Map<String, Object> nestedMaps(Iterator<String> keys, String value) {
if (keys.hasNext()) {
String key = keys.next();
Map<String, Object> nestMap = nestedMaps(keys, value);
Map<String, Object> map = new HashMap<>();
map.put(key, nestMap);
if (Objects.equals(nestMap, null))
map.put(key, value);
return map;
}
return null;
}
public void mergeNested(Object srcObj, Object targetObj) {
if (srcObj instanceof Map && targetObj instanceof Map) {
Map<String, Object> srcMap = (Map<String, Object>) srcObj;
Map<String, Object> targetMap = (Map<String, Object>) targetObj;
for (String targetKey : targetMap.keySet()) {
if (srcMap.containsKey(targetKey)) {
mergeNested(srcMap.get(targetKey), targetMap.get(targetKey));
} else {
srcMap.putAll(targetMap);
}
}
}
}
public Map<String, Object> objectmetainfo = new LinkedHashMap<>();
objectmetainfo.put("userdetails.info.metadata.user.home.address.details", "addressValue");
objectmetainfo.put("userdetails.info.metadata.user.id", "id");
objectmetainfo.put("userdetails.info.metadata.userSupervisor.id", "id");
objectmetainfo.put("info.metadata.code", "code");
objectmetainfo.put("zip", "zip");
public Map<String, Object> result = new HashMap<>();
for (Map.Entry<String, Object> e : objectmetainfo.entrySet()) {
List<String> keys = new ArrayList<>(Arrays.asList(e.getKey().split("\\.")));
Map<String, Object> nestedMaps = nestedMaps(keys.iterator(), String.valueOf(e.getValue()));
mergeNested(result, nestedMaps);
}
System.out.println(result);
我使用 toString 方法打印出所有的哈希图。 输出:
{
zip= zip,
userdetails= {
info= {
metadata= {
userSupervisor= {
id= id
},
user= {
id= id,
home= {
address= {
details= addressValue
}
}
}
}
}
},
info= {
metadata= {
code= code
}
}
}
推荐阅读
- html -
在 Android 版 Zoho Mail 应用程序上忽略标签
- woocommerce - Woocommerce 订阅 API 和 Authorize.net(信用卡支付失败(订阅续订:支付令牌丢失/无效。))
- vue.js - 如何在变量中设置动态值或连接两个变量Vue
- javascript - 如果字符串在 Javascript 中是不可变的,为什么 += 运算符会以它的方式工作?
- c++ - 如何使用 CMake 与 ntdll.lib 链接?
- data-conversion - 将 PubSubClient 主机存储到 ESP32 上的 EEPROM
- r - kableExtra 格式化表格式化科学指数
- javascript - 如何使用Javascript jquery从表单中正确传递数组中的变量
- javascript - 使用Javascript将日期转换为月份年份
- database - 在 Azure 门户创建数据库备份