起因是:目前辞职在家,想面试一下试试水,结果笔试题一做 emo 了 楼主被hr给的一道题难住了
这里给出比较简洁的实现:
Map<String, Map> treeMap = new HashMap<>();
Stream.of("中国 浙江 杭州","中国","中国 广东","中国 广东 广州 越秀区")
.forEach(s -> {
Map<String, Map> subTreeMap = treeMap;
for (String s1 : s.split(" ")) {
subTreeMap = subTreeMap.compute(s1, (key, oldValue) -> Optional.ofNullable(oldValue).orElseGet(HashMap::new));
}
}
);
System.out.println(JSONObject.toJSONString(treeMap, true));
输出结果:
{
"中国":{
"广东":{
"广州":{
"越秀区":{}
}
},
"浙江":{
"杭州":{}
}
}
}
不推荐在业务代码中写任何递归,递归存在不好理解难以维护和爆栈问题
而且所有的递归都可以转成循环,建议使用循环(while fori foreach)进行数据处理
多线程版
Map<String, Map> treeMap = new ConcurrentHashMap<>();
Stream.of("中国 浙江 杭州","中国","中国 广东","中国 广东 广州 越秀区")
.parallel()
.forEach(s -> {
Map<String, Map> subTreeMap = treeMap;
for (String s1 : s.split(" ")) {
subTreeMap = subTreeMap.compute(s1, (key, oldValue) -> Optional.ofNullable(oldValue).orElseGet(ConcurrentHashMap::new));
}
}
);
System.out.println(JSONObject.toJSONString(treeMap, true));