java实现树形结构

参考文件:https://www.cnblogs.com/zhizhao/p/9956158.html

 public ResponseEntity getRoomTree() {

     log.info("开始获取room节点树信息!!!");

 //    log.info( Integer.parseInt("111") );
/*     List<TreeNode> roomEntityList =  roomTreeMapper.getAll();
     log.info("总记录数 :"+ roomEntityList.size() ) ;
     Map<TreeNode , List<TreeNode>> resultLists = new HashMap<> ();
     List<TreeNode> resultList = new ArrayList<>();
     for (TreeNode  parRoom :roomEntityList
     ) {
         if( parRoom.getRoomId()  !=  null ){


             TreeNode sonRoom = getTree( parRoom ) ;
             if(StringUtil.isNotEmpty(sonRoom)){
                 resultList.add( sonRoom ) ;
             }
         }
     }
     */
     try{

         // 查询所有的许可数据
         List<TreeNode> roomEntityList =  roomTreeMapper.getAll();
         List<Map<String,Object>> data = new ArrayList<>();
         Map<String,Object> map = new HashMap<>();
         for (TreeNode p : roomEntityList) {
             map = new HashMap<>();
             map.put("id",p.getRoomId());
             map.put("pid",p.getParentId());
             map.put("name",p.getRoomName());
             data.add(map) ;
         }
         System.out.println("--------"+JSON.toJSONString(data));
         JSONArray result = listToTree(JSONArray.parseArray(JSON.toJSONString(data)),"id","pid","children");
         System.out.println(JSON.toJSONString(result));

         log.info("获取父子节点完毕 :" + roomEntityList.size() ) ;
         log.info("获取=========== :" + roomEntityList.toString()) ;
     }catch (Exception ex ){
         log.info( ex.toString() ) ;
     }
  //


     return null ;
 }
/**

 - listToTree
 - <p>方法说明<p>
 - 将JSONArray数组转为树状结构
 - @param arr 需要转化的数据
 - @param id 数据唯一的标识键值
 - @param pid 父id唯一标识键值
 - @param child 子节点键值
 - @return JSONArray
 */
public static JSONArray listToTree(JSONArray arr,String id,String pid,String child){
    JSONArray r = new JSONArray();
    JSONObject hash = new JSONObject();
    //将数组转为Object的形式,key为数组中的id
    for(int i=0;i<arr.size();i++){
        JSONObject json = (JSONObject) arr.get(i);
        hash.put(json.getString(id), json);
    }
    //遍历结果集
    for(int j=0;j<arr.size();j++){
        //单条记录
        JSONObject aVal = (JSONObject) arr.get(j);
        //在hash中取出key为单条记录中pid的值
        JSONObject hashVP = (JSONObject) hash.get(aVal.get(pid).toString());
        //如果记录的pid存在,则说明它有父节点,将她添加到孩子节点的集合中
        if(hashVP!=null){
            //检查是否有child属性
            if(hashVP.get(child)!=null){
                JSONArray ch = (JSONArray) hashVP.get(child);
                ch.add(aVal);
                hashVP.put(child, ch);
            }else{
                JSONArray ch = new JSONArray();
                ch.add(aVal);
                hashVP.put(child, ch);
            }
        }else{
            r.add(aVal);
        }
    }
    return r;
}

mybatis中sql配置

数据库为SQL SERVER

获取树形结构:

<mapper namespace="com.hwd.wisdomcloud.entrance.mapper.RoomTreeMapper">
    <!-- 配置结果集-->


    <select id="getAll" resultType="TreeNode" statementType="PREPARED" >
        with f as
        (
        SELECT   room_id, name ,type , parent_id  from pls_room where parent_id like '00000'
        union all
        SELECT  a.room_id, a.name ,a.type , a.parent_id from pls_room as a inner join f as b on a.parent_id=b.room_id AND  a.type <![CDATA[ <> ]]>'3'
        )
        select room_id as roomId ,name as roomName ,type,parent_id  as parentId FROM  f   ;

    </select>

根据子节点,获取父节点分支:

<select id="getAllParentDptNode" resultType="TreeNode" statementType="PREPARED" parameterType="String" >
    WITH  partents AS
    (
    SELECT  DptSysID, DptName , DptParentSysID FROM dbo.RS_Dpt  WHERE  DptSysID =#{DptSysID}
    UNION ALL
    (SELECT a.DptSysID , a.DptName  ,a.DptParentSysID FROM  dbo.RS_Dpt  AS  a INNER  JOIN
    partents AS  b ON  a.DptSysID=b.DptParentSysID
    )
    )
    SELECT DptSysID  as roomId , DptName  as roomName , DptParentSysID  as parentId  FROM partents
</select>

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值