2019独角兽企业重金招聘Python工程师标准>>>

1.新建一个TreeUtil的类

package com.zdnst.common.infra.utils;import java.util.*;/*** 把一个list集合,里面的bean含有 parentId 转为树形式**/
public class TreeUtil {/*** 判断两个父ID是否相同* @param p1* @param p2* @return*/private boolean isEqualsParentId(Object p1,Object p2){if(p1!=null && p1!=null){return p1.equals(p2);}else if(p1==null && p2 == null) {return true;}else if(p1==null && p2 != null) {if("".equals(p2.toString())){return true;}else{return false;}}else if(p1!=null && p2 == null) {if("".equals(p1.toString())){return true;}else{return false;}}else{return false;}}/*** 根据父节点的ID获取所有子节点,该方法顶级节点必须为空* @param list 分类表* @param parentId 传入的父节点ID* @return String*/public List<TreeObject> getChildTreeObjects(List<TreeObject> list,Object parentId) {List<TreeObject> returnList = new ArrayList<TreeObject>();if(list!=null&&list.size()>0) {for (Iterator<TreeObject> iterator = list.iterator(); iterator.hasNext(); ) {TreeObject t = (TreeObject) iterator.next();// 一、根据传入的某个父节点ID,遍历该父节点的所有子节点if (isEqualsParentId(t.getParentId(), parentId)) {recursionFn(list, t);returnList.add(t);}}if(returnList==null||returnList.size()==0){//如果返回出空结果,则说明非树,直接返回原来结果for (Iterator<TreeObject> iterator = list.iterator(); iterator.hasNext(); ) {TreeObject t = (TreeObject) iterator.next();returnList.add(t);}}}return returnList;}/*** 根据父节点的ID获取所有子节点,该方法顶级节点可以不为空,非树直接返回* @param list 分类表* @return String*/public List<TreeObject> getChildTreeObjects(List<TreeObject> list) {if(list!=null&&list.size()>0) {List<TreeObject> topList=new ArrayList<>();List<TreeObject> subList=new ArrayList<>();Map<String,String> idMap=new HashMap<>();for (Iterator<TreeObject> iterator = list.iterator(); iterator.hasNext(); ) {//归并所有list的id集合TreeObject t = (TreeObject) iterator.next();if(t.getId()!=null){idMap.put(t.getId().toString(), t.getId().toString());}}for (Iterator<TreeObject> iterator = list.iterator(); iterator.hasNext(); ) {//获取最顶级的listTreeObject t = (TreeObject) iterator.next();if(t.getParentId()==null||StringUtils.isEmpty(t.getParentId().toString())){topList.add(t);}else{String id=idMap.get(t.getParentId().toString());if(StringUtils.isEmpty(id)){topList.add(t);}else{subList.add(t);}}}if(topList!=null&&topList.size()>0&&subList!=null&&subList.size()>0){List<TreeObject> resultList=new ArrayList<>();for (TreeObject t:topList) {//将儿子级别的list归并到顶级中List<TreeObject> subOneList=new ArrayList<>();for (TreeObject sub:subList) {// 一、根据传入的某个父节点ID,遍历该父节点的所有子节点if (isEqualsParentId(sub.getParentId(), t.getId())) {recursionFn(subList, sub);subOneList.add(sub);}}if(subOneList!=null&&subOneList.size()>0) {t.setChildren(subOneList);}resultList.add(t);}return resultList;}else{return list;}}return list;}/*** 递归列表* @author lanyuan* Email: mmm333zzz520@163.com* @date 2013-12-4 下午7:27:30* @param list* @param t*/private void  recursionFn(List<TreeObject> list, TreeObject t) {List<TreeObject> childList = getChildList(list, t);// 得到子节点列表t.setChildren(childList);for (TreeObject tChild : childList) {if (hasChild(list, tChild)) {// 判断是否有子节点//returnList.add(TreeObject);Iterator<TreeObject> it = childList.iterator();while (it.hasNext()) {TreeObject n = (TreeObject) it.next();recursionFn(list, n);}}}}// 得到子节点列表private List<TreeObject> getChildList(List<TreeObject> list, TreeObject t) {List<TreeObject> tlist = new ArrayList<TreeObject>();Iterator<TreeObject> it = list.iterator();while (it.hasNext()) {TreeObject n = (TreeObject) it.next();if (isEqualsParentId(n.getParentId(),t.getId())) {tlist.add(n);}}return tlist;} List<TreeObject> returnList = new ArrayList<TreeObject>();/*** 根据父节点的ID获取所有子节点* @param list 分类表* @param parentId 传入的父节点ID* @param prefix 子节点前缀*/public List<TreeObject> getChildTreeObjects(List<TreeObject> list, Object parentId,String prefix){if(list == null) return null;for (Iterator<TreeObject> iterator = list.iterator(); iterator.hasNext();) {TreeObject node = (TreeObject) iterator.next();// 一、根据传入的某个父节点ID,遍历该父节点的所有子节点if (isEqualsParentId(node.getParentId(),parentId)) {recursionFn(list, node,prefix);}// 二、遍历所有的父节点下的所有子节点/*if (node.getParentId()==0) {recursionFn(list, node);}*/}return returnList;}private void recursionFn(List<TreeObject> list, TreeObject node,String p) {List<TreeObject> childList = getChildList(list, node);// 得到子节点列表if (hasChild(list, node)) {// 判断是否有子节点returnList.add(node);Iterator<TreeObject> it = childList.iterator();while (it.hasNext()) {TreeObject n = (TreeObject) it.next();n.setName(p+n.getName());recursionFn(list, n,p+p);}} else {returnList.add(node);}}// 判断是否有子节点private boolean hasChild(List<TreeObject> list, TreeObject t) {return getChildList(list, t).size() > 0 ? true : false;}// 本地模拟数据测试public void main(String[] args) {/*long start = System.currentTimeMillis();List<TreeObject> TreeObjectList = new ArrayList<TreeObject>();TreeObjectUtil mt = new TreeObjectUtil();List<TreeObject> ns=mt.getChildTreeObjects(TreeObjectList,0);for (TreeObject m : ns) {System.out.println(m.getName());System.out.println(m.getChildren());}long end = System.currentTimeMillis();System.out.println("用时:" + (end - start) + "ms");*/}}

2.新建类TreeObject

package com.zdnst.common.infra.utils;import java.util.List;/*** 这个是列表树形式显示的接口*/
public interface TreeObject {public Object getId();public void setId(Object id);public Object getParentId();public void setParentId(Object parentId);public String getName();public void setName(String name);public List getChildren();public void setChildren(List children);}

3.具体列表实体PubCompTypeDto实现TreeObject :

package com.zdnst.core.sys.application.dto;import com.zdnst.common.infra.dto.BaseDto;
import com.zdnst.common.infra.utils.TreeObject;import java.util.List;public class PubCompTypeDto extends BaseDto  implements TreeObject {private static final long serialVersionUID = 5726287409752473211L;private String comTypeItemCode;//公司类型CODE,由类型key+具体code组合private String comTypeItemName;//类型项名称private String comTypeItemDesc;//类型项描述private String parentCode;//父idprivate Long comTypeItemStatus;//1启用0停用/*** 类型KEY:* 环节:FN_LEAVE_CODE* 物品:FN_GOODS_CODE* 场地:FN_FIELD_CODE* 车辆:FN_CAR_CODE*/private String comTypeKey;private String companyId;//公司idprivate Long seqNo; private List children;//构造树使用public String getComTypeItemCode() {return comTypeItemCode;}public void setComTypeItemCode(String comTypeItemCode) {this.comTypeItemCode = comTypeItemCode == null ? null : comTypeItemCode.trim();}public String getComTypeItemName() {return comTypeItemName;}public void setComTypeItemName(String comTypeItemName) {this.comTypeItemName = comTypeItemName == null ? null : comTypeItemName.trim();}public String getComTypeItemDesc() {return comTypeItemDesc;}public void setComTypeItemDesc(String comTypeItemDesc) {this.comTypeItemDesc = comTypeItemDesc == null ? null : comTypeItemDesc.trim();}public String getParentCode() {return parentCode;}public void setParentCode(String parentCode) {this.parentCode = parentCode == null ? null : parentCode.trim();}public Long getComTypeItemStatus() {return comTypeItemStatus;}public void setComTypeItemStatus(Long comTypeItemStatus) {this.comTypeItemStatus = comTypeItemStatus;}public String getComTypeKey() {return comTypeKey;}public void setComTypeKey(String comTypeKey) {this.comTypeKey = comTypeKey == null ? null : comTypeKey.trim();}public String getCompanyId() {return companyId;}public void setCompanyId(String companyId) {this.companyId = companyId == null ? null : companyId.trim();}public Long getSeqNo() {return seqNo;}public void setSeqNo(Long seqNo) {this.seqNo = seqNo;}@Override
    public Object getId() {return getComTypeItemCode();}@Overridepublic void setId(Object id) {setComTypeItemCode((String)id);}@Overridepublic Object getParentId() {return getParentCode();}@Overridepublic void setParentId(Object parentId) {setParentCode((String)parentId);}@Overridepublic String getName() {return getComTypeItemName();}@Overridepublic void setName(String name) {setComTypeItemName(name);}@Overridepublic List getChildren() {return this.children;}@Overridepublic void setChildren(List children) {this.children = children;}
}

4.在使用中如下调用:

TreeUtil treeUtil = new TreeUtil();
List<TreeObject> treeList = treeUtil.getChildTreeObjects(pubCompTypeDtoList);
return JsonView.dataToJson(treeList, response);

转载于:https://my.oschina.net/u/2322635/blog/848884

将一个list转化成一颗树的输出方法相关推荐

  1. java中菜单的数据库_java将数据库中菜单表中内容转化成一个导航树

    数据库中字段: menuId   parentMenuId    menuName   link等 首先我们肯定是将所有的菜单从数据库中查到一个List中,下面我们需要对这个数组进行处理,将这个lis ...

  2. 树(5)-----判断两颗树一样或者一棵树是否是另外一颗的子树

    1.判断两颗树是否一样.(递归) def isSameTree(p,q):if not p and not q:return Trueelif not p and q or (not q and p) ...

  3. 植树节-在电脑上种颗树-python实现-递归

    猛的发现今天是植树节,从来不关注节日的我今日要为咱们植树节来纪念纪念,咱们画颗树! 本文涉及Python Turtle库,递归算法- 先给代码,咱们再来慢慢解释递归的魅力以及一个理解递归算法运行机制的 ...

  4. C代码实现将一颗树转换成二叉树(给定树)

    将树转换成二叉树的方法: 1.加线.在所有的兄弟结点之间加一条线. 2.去线.树中的每个结点,只保留它与第一个孩子结点的连线,删除其他孩子结点之间的连线. 3.调整.以树的根结点为轴心,将整个树调节一 ...

  5. R语言构建xgboost模型:使用xgboost的第一颗树(前N颗树)进行预测推理或者使用全部树进行预测推理、比较误分类率指标

    R语言构建xgboost模型:使用xgboost的第一颗树(前N颗树)进行预测推理或者使用全部树进行预测推理.比较误分类率指标 目录

  6. 二叉树题目----2 检查两颗树是否相同 和 对称二叉树的判定

    检查两颗树是否相同 思路 根要相等 p->val == q->val 左子树相等 isSameTree(p->left,q->left) 右子树也要相等 isSameTree( ...

  7. 判断无向图G是否是一颗树

    一个无向图是一颗树的条件是有n-1条边的连通图,n为图中顶点的个.边和顶点的数目是否满足条件可有图的信息直接判断,连通与否可以用遍历能否访问到所有顶点来判断. 结构体定义: #include<s ...

  8. 将一颗树反转为其镜像

    思路 树的镜像指相互交换非叶子节点,左子树,右子树之后所得到的另外一颗树 BinaryTreeNode mirrorOfBinaryTreeNode(BinaryTreeNode root){Bina ...

  9. 编程将一个整数分解成一个质因数的连乘积,并打印在屏幕上

    //编程将一个整数分解成一个质因数的连乘积,并打印在屏幕上 //***本题的难点是既要找出质因数,又要保证其连乘为该数 //***需要两个循环,外循环与内循环 /*每个合数 都可以写成几个 质数 相乘 ...

最新文章

  1. MYSQL数据库从A表把数据插入B表
  2. android viewgroup 事件,android中viewgroup的事件传递分析
  3. Tensorflow【实战Google深度学习框架】用卷积神经网络打造图片识别应用
  4. python – 处理psycopg2中的错误 psycopg2.errors.InFailedSqlTransaction: current transaction is aborted, comm
  5. SSH框架整合遇到的错误——org.springframework.beans.NotWritablePropertyException:
  6. [机器学习]回归--Polinomial Regression 多项式回归
  7. Qt使用导出类报错:error C2491: “ZMapWidget::staticMetaObject”: 不允许 dllimport 静态数据成员 的定义
  8. 【C语言】计算N名同学的某门功课的平均成绩
  9. jdk8新特性(二)Stream流式操作
  10. java中interrupt_Java中interrupt的使用
  11. NVIDIA硬编码方式:omxh264enc和nvv4l2h264enc
  12. netty 使用阻塞发送_「解」互联网大厂Java面试题——Netty 面试题解析
  13. 请描述osi七层模型,并简要概括各层功能
  14. html设置js的cookies,javascript怎么修改cookie?
  15. 超大流量分布式系统架构解决方案 人人都是架构师2.0
  16. 文件或目录损坏且无法读取android studio
  17. 北京机动车和自住房摇号查询
  18. Android开发 自定义控件 边框TextView
  19. c#如何实现软件授权后才能使用?
  20. 实现智能语音识别服务

热门文章

  1. antd mysql_create-react-app使用antd按需加载的样式无效问题的解决
  2. 为什么下雨天容易犯困
  3. 安全云盘项目(四)4.1: 云盘原型系统详细设计
  4. C++socket编程(五):5.2 tcp编程总结
  5. printf 重新实现put_Go 实现海量日志收集系统(四)
  6. linux pandas教程_这7种Python的全新玩法,你们一定不知道!(附赠Python教程)
  7. acivity 横屏_Activity横竖屏切换时先看到横屏/竖屏再变换回竖屏/横屏
  8. oracle视图可以带日期变量么,创建视图时日期字段如何只都天
  9. mysql group by 两列_MySQL GROUP BY两列
  10. img标签 三种获取数据方式