工作的時候遇到根據根結點到葉結點的路徑還原多叉樹的問題,下面是我的源代碼,不知道你們有沒有好的方法,歡迎評論指正。
由以下三個路徑:
路徑深度可以自定義,本文路徑深度爲4
還原成如下多叉樹,
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
import java.util.*;
/**
* @Author: RichurLiu
* @Date: 2019/7/19
*/
public class ListMain {
public static void main(String[] args) {
Node root = new Node(0L,"", (short) 0, new ArrayList<>());
PositionListVO pl1 = new PositionListVO(11L,21L,31L,41L);
PositionListVO pl2 = new PositionListVO(12L,21L,32L,42L);
PositionListVO pl3 = new PositionListVO(11L,22L,33L,43L);
PositionListBaseVO plb01 = new PositionListBaseVO(11L,(short)1,"11L");
PositionListBaseVO plb02 = new PositionListBaseVO(12L,(short)1,"12L");
PositionListBaseVO plb03 = new PositionListBaseVO(21L,(short)2,"21L");
PositionListBaseVO plb04 = new PositionListBaseVO(22L,(short)2,"22L");
PositionListBaseVO plb05 = new PositionListBaseVO(31L,(short)3,"31L");
PositionListBaseVO plb06 = new PositionListBaseVO(32L,(short)3,"32L");
PositionListBaseVO plb07 = new PositionListBaseVO(33L,(short)3,"33L");
PositionListBaseVO plb08 = new PositionListBaseVO(41L,(short)4,"41L");
PositionListBaseVO plb09 = new PositionListBaseVO(42L,(short)4,"42L");
PositionListBaseVO plb10 = new PositionListBaseVO(43L,(short)4,"43L");
//1將所有路徑加載到list中
List<PositionListVO> positionList = new ArrayList<>();
positionList.add(pl1);
positionList.add(pl2);
positionList.add(pl3);
//2將所有基礎數據加載到map中
map.put(plb01.getId(),plb01);
map.put(plb02.getId(),plb02);
map.put(plb03.getId(),plb03);
map.put(plb04.getId(),plb04);
map.put(plb05.getId(),plb05);
map.put(plb06.getId(),plb06);
map.put(plb07.getId(),plb07);
map.put(plb08.getId(),plb08);
map.put(plb09.getId(),plb09);
map.put(plb10.getId(),plb10);
//List<PositionListBaseVO> positionListBase = new ArrayList<>();
for (PositionListVO listVO : positionList) {
Node parent = root;
parent = insertNode(initNode(listVO.getListId()), parent.getSonList());
if(null == parent.getSonList()){
parent.setSonList(new ArrayList<>());
}
parent = insertNode(initNode(listVO.getChildListId()), parent.getSonList());
if(null == parent.getSonList()){
parent.setSonList(new ArrayList<>());
}
parent = insertNode(initNode(listVO.getFunctionId()), parent.getSonList());
if(null == parent.getSonList()){
parent.setSonList(new ArrayList<>());
}
insertNode(initNode(listVO.getStandardId()), parent.getSonList());
}
List<Node> sonList = root.getSonList();
System.out.println(JSON.toJSONString(sonList));
}
static Map<Long,PositionListBaseVO> map = new HashMap<>();
/**
* 初始化結點信息
* @param id
* @return
*/
private static Node initNode(long id){
Node n = new Node();
PositionListBaseVO vo = map.get(id);
if(null == vo){
//拋異常
return n;
}
n.setId(vo.getId());
n.setType(vo.getType());
n.setName(vo.getName());
return n;
}
/**
* 如果樹中無此結點,向樹中插入一個結點
* @param node
* @param sonList
* @return
*/
private static Node insertNode(Node node, List<Node> sonList){
boolean flag = false;
for (Node n : sonList) {
if(n.getId().equals(node.getId())){
flag = true;
node = n;
break;
}
}
//樹中不存在則添加
if(!flag){
sonList.add(node);
}
return node;
}
}
結點:
@Getter
@Setter
class Node {
private Long id; //結點id
private String name; //結點名稱
private Short type;
private List<Node> sonList; //該結點的 子結點集合
Node(){}
Node(Long id, String name, Short type, List<Node> sonList) {
this.id = id;
this.name = name;
this.type = type;
this.sonList = sonList;
}
}
基礎類:
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
/**
* @Author: RichurLiu
* @Date: 2019/7/21
*/
@Setter
@Getter
@AllArgsConstructor
public class PositionListBaseVO {
private Long id;
private Short type;
private String name;
PositionListBaseVO(){}
}
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
/**
* @Author: RichurLiu
* @Date: 2019/7/21
*/
@Setter
@Getter
@AllArgsConstructor
public class PositionListVO {
private Long listId;
private Long childListId;
private Long functionId;
private Long standardId;
PositionListVO(){}
}
會用到兩個jar包:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<scope>compile</scope>
</dependency>