package com.infish.util;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* @author wxl
* @Title: TreeUtil
* @Description: 通用Util,根据父节点关系将列表转树形结构
* @date 2018-12-10 17:54
*/
public class TreeUtil { /**
* @Description: 首字母转大写
* @param
* @return
* @throws
* @author wxl
* @date 2018-12-10 20:44
*/
public static String firstCharToUpperCase(String str){
if(str == null){ return null; }
if("".equals(str)){ return ""; }
char[] cs = str.toCharArray();
cs[0]-=32;
return String.valueOf(cs);
} /** 调用示例:示例: List<TreeNode> head = toTree(TreeNode.class,nodeList,"id","parentId","children",0L);
* @Description: List转Tree
* @param clazz 类.class
* @param dataList 数据列表
* @param idField ID字段名称
* @param parentIdField 父节点ID字段名称
* @param childrenField 孩子字段名称
* @param rootFlag 如果某个节点的ParentId等于rootFlag,即改节点为根节点
* @return
* @throws
* @author wxl
* @date 2018-12-10 20:44
*/
public static <T> List<T> toTree(Class<T> clazz,List<T> dataList,String idField,String parentIdField,String childrenField,Object rootFlag) throws Exception {
List<T> treeList = new ArrayList<>();
Map<Object,T> map = new HashMap<>();
Map<Object,Boolean> flag = new HashMap<>();
String getIdStr = "get"+firstCharToUpperCase(idField);
String getParentIdStr = "get"+firstCharToUpperCase(parentIdField);
String getChildrenStr = "get"+firstCharToUpperCase(childrenField);
String setChildrenStr = "set"+firstCharToUpperCase(childrenField);
Method getIdMethod = null;
Method getParentIdMethod=null;
Method getChildrenMethod=null;
Method setChildrenMethod=null;
try{
getIdMethod = clazz.getDeclaredMethod(getIdStr);
getParentIdMethod = clazz.getDeclaredMethod(getParentIdStr);
getChildrenMethod = clazz.getDeclaredMethod(getChildrenStr);
setChildrenMethod = clazz.getDeclaredMethod(setChildrenStr,List.class);
}catch (Exception e){
e.printStackTrace();
throw new RuntimeException("转树形结构-通过反射获取方法错误!",e);
} for(T node:dataList){
map.put(getIdMethod.invoke(node),node);
Object parentIdTmp = getParentIdMethod.invoke(node);
if(rootFlag==null || "".equals(rootFlag)){
if(parentIdTmp==null || "".equals(parentIdTmp)){
treeList.add(node);
}
}else{
if(rootFlag.equals(parentIdTmp)){
treeList.add(node);
}
}
}
for(T node:dataList){
T parentNode = map.get(getParentIdMethod.invoke(node));
if(parentNode!=null){
List<T> invoke = (List<T>)getChildrenMethod.invoke(parentNode);
if(invoke==null){
invoke=new ArrayList<>();
setChildrenMethod.invoke(parentNode,invoke);
}
invoke.add(node); }
}
return treeList;
} /* public static void main(String[] args) throws Exception {
List<TreeNode> sourceList = new ArrayList<>();
TreeNode n1 = new TreeNode(); n1.setId(1);n1.setParentId(null); sourceList.add(n1);
TreeNode n2 = new TreeNode(); n2.setId(2);n2.setParentId(1); sourceList.add(n2);
TreeNode n3 = new TreeNode(); n3.setId(3);n3.setParentId(2); sourceList.add(n3);
List<TreeNode> treeNodes = toTree(TreeNode.class, sourceList, "id", "parentId", "children", null);
treeNodes.forEach(n-> System.out.println(n));
}*/
}

TreeUtil.java的更多相关文章

  1. 【原】无脑操作:EasyUI Tree实现左键只选择叶子节点、右键浮动菜单实现增删改

    Easyui中的Tree组件使用频率颇高,经常遇到的需求如下: 1.在树形结构上,只有叶子节点才能被选中,其他节点不能被选中: 2.在叶子节点上右键出现浮动菜单实现新增.删除.修改操作: 3.在非叶子 ...

  2. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  3. java 根据 根节点及所有子成员 构造树tree

    实体类entity package com.ompa.biz.entity; import java.util.ArrayList; import java.util.List; public cla ...

  4. java递归 处理权限管理菜单树或分类

    1.数据库表设计 2.实体类设计 package com.ieou.capsule.dto.SystemPermissions; import java.util.List; /** * 功能菜单类 ...

  5. Atitit。Tree文件解析器的原理流程与设计实现  java  c# php js

    Atitit.Tree文件解析器的原理流程与设计实现  java  c# php js 1. 解析原理与流程1 1.1. 判断目录  ,表示服  dirFlagChar = "└├─&quo ...

  6. Java生成菜单树(目录树)的几种方式

    本文介绍两种不同生成多级目录树的方式:1. 递归生成,2.  map+list 集合生成.最下方会附上完整代码. 生成树的基本规则:子节点的par_id等于父节点的id. 1. 实体类 import ...

  7. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  8. Elasticsearch之java的基本操作一

    摘要   接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...

  9. 论:开发者信仰之“天下IT是一家“(Java .NET篇)

    比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...

随机推荐

  1. .NET Core 对象池的使用

    昨天在『.NET 大牛之路』技术群和大家聊到了对象池的话题,今天展开详细讲讲这个知识点. 池这个概念大家都很熟悉,比如我们经常听到数据库连接池和线程池.它是一种基于使用预先分配资源集合的性能优化思想. ...

  2. leetcode TOP100 字母异位词分组

    字母异位词分组 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 思路: 一个map,将每个字符串字符进行记数,字符作为map的key,次数初始为零,以此来标识字 ...

  3. DawgCTF wp(re和crypto)

    简单写写思路,想看详解的..我脚本有些丢失了..师傅请移步. 挂了个vpn,算正式打这种国际赛,全是英文.上去打了两天,昨晚晚上划水了一晚上补作业...,re那时候写出来三道,Potentially ...

  4. [源码解析] 深度学习分布式训练框架 horovod (14) --- 弹性训练发现节点 & State

    [源码解析] 深度学习分布式训练框架 horovod (14) --- 弹性训练发现节点 & State 目录 [源码解析] 深度学习分布式训练框架 horovod (14) --- 弹性训练 ...

  5. css--filter(滤镜) 属性

    前言 前段时间找工作面试官问到一个问题,你如何将一个网页整体置灰?面试遇到这样的问题,一下束手无策,之前没有接触过这样的需求,因此没有回答上来,面试结束我才知道了这是考查对 CSS3 的新属性的了解. ...

  6. 小哈学python----一行代码输出特定字符"Love"拼成的心形

    print('\n'.join([''.join([('Love'[(x-y) % len('Love')] if ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2* ...

  7. SECURECRT 连接锐捷交换机CONSOLE

    协议选择Serial,端口选择COM1.波特率设置为9600.RTS/CTS要把勾去掉(关闭流控功能)

  8. C语言变量 类型判断

    变量三要素: 一个变量有三个基本的要素,变量的名称,变量的类型,变量的值.所以int a = 10; 变量名为a,变量的存储类型为int型,变量的值为10. 变量还有一些属性如作用范围和存储类型. 变 ...

  9. YARN学习总结之架构

    一.yarn产生背景 1) 源于MRv1的缺陷:扩展性受限.单点故障.难以支持MR之外的计算框架: 2) 多计算框架各自为战,数据共享困难,资源利用率低: MR: 离线计算框架 Storm:实时计算框 ...

  10. UnitTest+HTMLTestRunner实战

    框架 步骤 先建立images,reports,tools文件夹 把HTMLTestRunner.py放进tools中  文件内容  https://www.cnblogs.com/wangxue13 ...