菜單樹的進階版,支持多屬性擴展

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": []
                }
              ]
            ]
          }
        ]
      ]
    }
  ]
]




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章