package com.example.dataStructure.collectionToTree;
import com.alibaba.fastjson.JSON;
import org.springframework.util.StringUtils;
import java.util.*;
public class KypCodeMappingTree {
Node[] heads;
public KypCodeMappingTree(List<Map<String,String>> list) {
this.heads = this.initHeads(list);
this.treeIfy(list);
}
/**
* 初始化头节点
* @param list
* @return
*/
private Node[] initHeads(List<Map<String,String>> list){
List<Node> headList = new ArrayList<Node>();
if(list == null || list.isEmpty()){
return null;
}
for (Map<String,String> map:list
) {
if(StringUtils.isEmpty(this.mapPreWords(map))){
Node node = new Node();
node.setKey(this.mapWords(map));
headList.add(node);
}
}
Node[] heads = new Node[headList.size()];
return headList.toArray(heads);
}
public String mapWords(Map map){
return map.get("columnName")+","+map.get("valueCode");
}
public String mapPreWords(Map map){
if(StringUtils.isEmpty(map.get("preColumnName")) || StringUtils.isEmpty(map.get("preValueCode"))){
return null;
}
return map.get("preColumnName")+","+map.get("preValueCode");
}
/**
* 树化
* @param list
*/
protected void treeIfy(List<Map<String,String>> list){
// 将list转换成父(key)子(value)的map
Map<String,List<String>> map = reverse(list);
if(this.heads != null && heads.length>0){
for (Node head:heads
) {
this.addChildren(head,map);
}
}
}
/**
* 添加子节点
* @param head
* @param map
*/
protected void addChildren(Node head,Map<String,List<String>> map){
if(head==null){
return;
}
Queue<Node> q=new LinkedList<>();
q.add(head);
while (!q.isEmpty()){
Node curr = q.poll();
List<String> childList = map.get(curr.getKey());
if(childList != null && !childList.isEmpty()){
for (String childKey:childList
) {
Node child = new Node();
child.setKey(childKey);
curr.getChildren().add(child);
q.add(child);
}
}
}
}
/**
* 将list转成含有父子节点层级关系的map,key代表父节点,map中的value值是list集合,代表子节点列表
* @param list
* @return
*/
protected Map<String,List<String>> reverse(List<Map<String,String>> list){
if(list == null || list.isEmpty()){
return null;
}
Map<String,List<String>> map = new HashMap<>();
for (Map<String,String> m:list
) {
if(!map.containsKey(this.mapWords(m))){
List<String> mapL = new ArrayList<>();
mapL.addAll(this.findChildren(list,m));
map.put(this.mapWords(m),mapL);
}
}
return map;
}
/**
* 获取节点map的value,即子节点的key的list
* @param list
* @param map
* @return
*/
public List<String> findChildren(List<Map<String,String>> list,Map<String,String> map){
List<String> children = new ArrayList<>();
for (Map<String,String> m:list
) {
if(this.mapWords(map).equals(this.mapPreWords(m))){
children.add(this.mapWords(m));
}
}
return children;
}
public Node[] getHeads() {
return heads;
}
public void setHeads(Node[] heads) {
this.heads = heads;
}
static class Node {
String key;
List<Node> children = new ArrayList<>();
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public List<Node> getChildren() {
return children;
}
public void setChildren(List<Node> children) {
this.children = children;
}
}
public static void main(String[] args) {
List<Map<String,String>> list = initData();
KypCodeMappingTree tree = new KypCodeMappingTree(list);
System.out.println(JSON.toJSONString(tree));
}
public static List<Map<String,String>> initData(){
Map k1 = (new KypCodeMapping("kyp_level1", "B2C", null, null)).objectToMap();
Map k3 = (new KypCodeMapping("kyp_level2", "B2C固收类", "kyp_level1", "B2C")).objectToMap();
Map k4 = (new KypCodeMapping("kyp_level2", "B2C宝宝类", "kyp_level1", "B2C")).objectToMap();
Map k5 = (new KypCodeMapping("kyp_level2", "B2C跨境类", "kyp_level1", "B2C")).objectToMap();
Map k6 = (new KypCodeMapping("kyp_level1", "爱理财", null, null)).objectToMap();
Map k14 = (new KypCodeMapping("kyp_level2", "爱理财", "kyp_level1", "爱理财")).objectToMap();
Map k15 = (new KypCodeMapping("kyp_level3", "爱理财", "kyp_level2", "爱理财")).objectToMap();
Map k16 = (new KypCodeMapping("kyp_level4", "爱理财", "kyp_level3", "爱理财")).objectToMap();
Map k7 = (new KypCodeMapping("kyp_level1", "投股票", null, null)).objectToMap();
Map k9 = (new KypCodeMapping("kyp_level2", "爱理财1号", "kyp_level1", "爱理财")).objectToMap();
Map k2 = (new KypCodeMapping("kyp_level2", "爱理财2号", "kyp_level1", "爱理财")).objectToMap();
Map k8 = (new KypCodeMapping("kyp_level2", "爱理财3号", "kyp_level1", "爱理财")).objectToMap();
Map k10 = (new KypCodeMapping("kyp_level3", "爱理财1号1类", "kyp_level2", "爱理财1号")).objectToMap();
Map k11 = (new KypCodeMapping("kyp_level3", "爱理财1号2类", "kyp_level2", "爱理财1号")).objectToMap();
Map k12 = (new KypCodeMapping("kyp_level4", "爱理财1号1类a", "kyp_level3", "爱理财1号1类")).objectToMap();
Map k13 = (new KypCodeMapping("kyp_level4", "爱理财1号1类b", "kyp_level3", "爱理财1号1类")).objectToMap();
List<Map<String,String>> list = new ArrayList<>();
list.add(k1);list.add(k2);list.add(k3);list.add(k4);list.add(k5);list.add(k6);list.add(k7);
list.add(k8);list.add(k9);list.add(k10);list.add(k11);list.add(k12);list.add(k13);list.add(k14);
list.add(k15);list.add(k16);
return list;
}
}
结果:{"heads":[{"children":[{"children":[],"key":"kyp_level2,B2C固收类"},{"children":[],"key":"kyp_level2,B2C宝宝类"},{"children":[],"key":"kyp_level2,B2C跨境类"}],"key":"kyp_level1,B2C"},{"children":[{"children":[],"key":"kyp_level2,爱理财2号"},{"children":[],"key":"kyp_level2,爱理财3号"},{"children":[{"children":[{"children":[],"key":"kyp_level4,爱理财1号1类a"},{"children":[],"key":"kyp_level4,爱理财1号1类b"}],"key":"kyp_level3,爱理财1号1类"},{"children":[],"key":"kyp_level3,爱理财1号2类"}],"key":"kyp_level2,爱理财1号"},{"children":[{"children":[{"children":[],"key":"kyp_level4,爱理财"}],"key":"kyp_level3,爱理财"}],"key":"kyp_level2,爱理财"}],"key":"kyp_level1,爱理财"},{"children":[],"key":"kyp_level1,投股票"}]}
{
"heads":[
{
"children":[
{
"children":[
],
"key":"kyp_level2,B2C固收类"
},
{
"children":[
],
"key":"kyp_level2,B2C宝宝类"
},
{
"children":[
],
"key":"kyp_level2,B2C跨境类"
}
],
"key":"kyp_level1,B2C"
},
{
"children":[
{
"children":[
],
"key":"kyp_level2,爱理财2号"
},
{
"children":[
],
"key":"kyp_level2,爱理财3号"
},
{
"children":[
{
"children":[
{
"children":[
],
"key":"kyp_level4,爱理财1号1类a"
},
{
"children":[
],
"key":"kyp_level4,爱理财1号1类b"
}
],
"key":"kyp_level3,爱理财1号1类"
},
{
"children":[
],
"key":"kyp_level3,爱理财1号2类"
}
],
"key":"kyp_level2,爱理财1号"
},
{
"children":[
{
"children":[
{
"children":[
],
"key":"kyp_level4,爱理财"
}
],
"key":"kyp_level3,爱理财"
}
],
"key":"kyp_level2,爱理财"
}
],
"key":"kyp_level1,爱理财"
},
{
"children":[
],
"key":"kyp_level1,投股票"
}
]
}