java建立樹形結構
阿新 • • 發佈:2018-11-24
TreeUtil
package com.shop.prise.common.utils; import com.shop.prise.common.model.Node; import java.util.ArrayList; import java.util.List; /** * descript: * creat by on 2018/9/27 */ public class TreeUtil { // 入口方法 public static List<Node> getTree(List<Node> nodeList) { List<Node> list = new ArrayList<Node>(); // 遍歷節點列表 for (Node node : nodeList) { if (node.getParentId().equals("-1")) { // parentID為-1(根節點)作為入口 node.setChildren( getChildrenNode(node.getId(), nodeList)); list.add(node); } } return list; } // 獲取子節點的遞迴方法 private static List<Node> getChildrenNode(String id, List<Node> nodeList) { List<Node> list = new ArrayList<Node>(); for (Node node : nodeList) { if (node.getParentId().equals(id)) { // 遞迴獲取子節點 node.setChildren(getChildrenNode(node.getId(), nodeList)); list.add(node); } } return list; } }
Node
package com.shop.prise.common.model; import java.util.ArrayList; import java.util.List; /** * descript: * creat by on 2018/9/27 */ public class Node { private String id; private String name; private String parentId; //private int order; private List<Node> children = new ArrayList<Node>(); public Node() { } public Node(String id, String name, String parentId) { this.id = id; this.name = name; this.parentId = parentId; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getParentId() { return parentId; } public void setParentId(String parentId) { this.parentId = parentId; } /*public int getOrder() { return order; } public void setOrder(int order) { this.order = order; }*/ public List<Node> getChildren() { return children; } public void setChildren(List<Node> children) { this.children = children; } }
Children
package com.shop.prise.common.model; import java.util.ArrayList; import java.util.List; /** * descript: * creat by zhiyu on 2018/9/27 */ public class Children { private List<Node> list = new ArrayList<Node>(); // ...get set 方法,構造方法 public List<Node> getList() { return list; } public void setList(List<Node> list) { this.list = list; } public int getSize() { return list.size(); } public void addChild(Node node) { list.add(node); } }
使用
//查詢所有分類
List<GoodsCategory> queryList = goodsCategoryMapper.getAllGoodsCategory();
List<Node> nodeList = new ArrayList<>();
for (GoodsCategory goodsCategory :queryList){
nodeList.add(new Node(goodsCategory.getId(), goodsCategory.getName(), goodsCategory.getParentId()));
}
List<Node> nodeTree = TreeUtil.getTree(nodeList);
以上就是樹形結構的生成了
下面說說怎麼解析樹了
/**
* TODO: 將樹的所有id取出來
* 我們利用sql的in查詢即可查出該分類下的商品了
* @return
* @author
* @date 2018/10/11 19:12
*/
private List<String> getCategoryIds(String id) {
//查詢所有分類
List<GoodsCategory> queryList = goodsCategoryMapper.getAllGoodsCategory();
List<Node> nodeList = new ArrayList<>();
for (GoodsCategory goodsCategory : queryList) {
nodeList.add(new Node(goodsCategory.getId(), goodsCategory.getName(), goodsCategory.getParentId()));
}
//獲取該分類下所有子分類並拼接成樹
nodeList = TreeUtil.getTree(nodeList, id);
System.out.println(JsonUtils.objectToJson(nodeList));
recursion(nodeList);
return cList;
}
/**
* TODO: 遞迴查詢子分類
*
* @return
* @author
* @date 2018/10/11 19:33
*/
private Node recursion(List<Node> root) {
if (root == null) {
return null;
} else {
Node nodeResult = null;
for (Node node : root) {
cList.add(node.getId());
//如果有子分類繼續查詢
if (hasChild(node)) {
nodeResult = recursion(node.getChildren());
}
}
return nodeResult;
}
}
/**
* TODO: 判斷樹是否有子節點
*
* @return
* @author
* @date 2018/10/11 19:13
*/
private boolean hasChild(Node root) {
boolean has = false;
if (root != null && root.getChildren() != null && !root.getChildren().isEmpty()) {
has = true;
}
return has;
}