1、樹接口
package com.lming.chcservice.util;
import java.util.List;
/**
*
* 樹的基本結構
*
* @Author shinyZo
* @date 2017-11-24
* @description
*/
public interface Tree {
/**
* 節點
* @return
*/
public String getNodeId();
/**
* 父節點
* @return
*/
public String getParentId();
/**
* 節點名稱
* @return
*/
public String getNodeName();
/**
* 是否有孩子
* @param isHasChild
*/
public void isHasChildren(Boolean isHasChild);
/**
* 孩子節點集合
* @param childrens
*/
public void setChildrens(List<?> childrens);
}
2、抽象類
package com.lming.chcservice.util;
/**
* 抽象類實現樹
* 並可以對樹進行擴展
* 例如 icon,linkUrl等屬性
* @Author shinyZo
* @date 2017-11-24
* @description
*/
public abstract class TreeAbstr implements Tree {
public void setIcon(String icon) {};
}
3、具體業務對象
package com.lming.chcservice.util;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* 具體項目中樹林
*/
@Setter
@Getter
public class TreeNode extends TreeAbstr {
private String nodeId;
private String nodeName;
private String parentId;
private boolean hasChildren;
private List<?> childrens;
private String rightUrl;
private String icon;
@Override
public void isHasChildren(Boolean isHasChild) {
this.hasChildren= isHasChild;
}
@Override
public void setChildrens(List<?> childrens) {
this.childrens = childrens;
}
@Override
public String getNodeId() {
return this.nodeId;
}
@Override
public String getParentId() {
return this.parentId;
}
@Override
public String getNodeName() {
return this.nodeName;
}
public TreeNode(String nodeId, String parentId, String nodeName) {
this.nodeId = nodeId;
this.nodeName = nodeName;
this.parentId = parentId;
}
}
4、工具類package com.lming.chcservice.util;
import com.lming.chcservice.entity.ProductCategory;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* 樹形結構工具類
* <p>
* 將一組list對象轉成樹形結構
* 該list需符合設定的字段類型
*/
public class TreeUtil {
public static Map<String, Object> mapArray = new LinkedHashMap<String, Object>();
public List<TreeAbstr> menuCommon;
public List<Object> list = new ArrayList<Object>();
public List<Object> treeMenu(List<TreeAbstr> menu) {
this.menuCommon = menu;
for (TreeAbstr treeNode : menu) {
// Map<String, Object> mapArr = new LinkedHashMap<String, Object>();
List<Object> childList = new ArrayList<>();
if (treeNode.getParentId().equals("0")) {
//setTreeMap(mapArr, treeNode);
setChildList(childList, treeNode);
list.add(childList);
}
}
return list;
}
public List<?> menuChild(String id) {
List<Object> lists = new ArrayList<Object>();
for (TreeAbstr a : menuCommon) {
//Map<String, Object> childArray = new LinkedHashMap<String, Object>();
List<Object> childList = new ArrayList<>();
if (a.getParentId().equals(id)) {
//setTreeMap(childArray, a);
setChildList(childList, a);
lists.add(childList);
}
}
return lists;
}
private void setTreeMap(Map<String, Object> mapArr, TreeAbstr treeNode) {
mapArr.put("nodeId", treeNode.getNodeId());
mapArr.put("nodeName", treeNode.getNodeName());
mapArr.put("parentId", treeNode.getParentId());
List<?> childrens = menuChild(treeNode.getNodeId());
if (childrens.size() > 0) {
mapArr.put("hasChildren", true);
} else {
mapArr.put("hasChildren", false);
}
mapArr.put("childrens", childrens);
}
private void setChildList(List<Object> childList, TreeAbstr treeNode) {
List<?> childrens = menuChild(treeNode.getNodeId());
treeNode.setChildrens(childrens);
if (childrens.size() > 0) {
treeNode.isHasChildren(true);
} else {
treeNode.isHasChildren(false);
}
childList.add(treeNode);
}
public static void main(String[] args) {
List<TreeAbstr> treeNodeList = new ArrayList<>();
TreeNode treeNode1 = new TreeNode("1", "0", "首頁");
TreeNode treeNode2 = new TreeNode("2", "0", "訂單");
TreeNode treeNode3 = new TreeNode("3", "1", "預約");
TreeNode treeNode4 = new TreeNode("4", "2", "捐獻");
TreeNode treeNode5 = new TreeNode("5", "4", "我的訂單");
TreeNode treeNode7 = new TreeNode("7", "6", "個人中心2");
TreeNode treeNode8 = new TreeNode("8", "99", "個人中心3");
treeNode1.setIcon("icon-home");
treeNode1.setRightUrl("/index");
treeNodeList.add(treeNode1);
treeNodeList.add(treeNode5);
treeNodeList.add(treeNode3);
treeNodeList.add(treeNode4);
treeNodeList.add(treeNode2);
treeNodeList.add(treeNode7);
treeNodeList.add(treeNode8);
TreeUtil treeUtil = new TreeUtil();
List<Object> objectList = treeUtil.treeMenu(treeNodeList);
System.out.print(JsonUtil.toJson(objectList));
}
}
5:測試結果
[ [ { "nodeId": "1", "nodeName": "首頁", "parentId": "0", "hasChildren": true, "childrens": [ [ { "nodeId": "3", "nodeName": "預約", "parentId": "1", "hasChildren": false, "childrens": [] } ] ], "rightUrl": "/index", "icon": "icon-home" } ], [ { "nodeId": "2", "nodeName": "訂單", "parentId": "0", "hasChildren": true, "childrens": [ [ { "nodeId": "4", "nodeName": "捐獻", "parentId": "2", "hasChildren": true, "childrens": [ [ { "nodeId": "5", "nodeName": "我的訂單", "parentId": "4", "hasChildren": false, "childrens": [] } ] ] } ] ] } ] ]