java树形结构生成工具类
1 /** 2 * *************************************************************************** 3 *模块名 : 4 *创建时间 : 2017年9月7日 5 *实现功能 :树形结构处理工具类 6 *作者 : 揣怀梦想的猪 7 *版本 : v0.0.1 8 ----------------------------------------------------------------------------- 9 *修改记录: 10 *日 期 版本 修改人 修改内容 11 *2017年9月7日 v0.0.1 揣怀梦想的猪 创建 12 **************************************************************************** 13 */ 14 public class TreeUtils { 15 private static final String COLUMN_ID_LOWCASE = "categoryCode"; //编号字段 16 private static final String COLUMN_CHILDREN = "children"; 17 private static final String PARENT_FIELD_NAME="parentCode"; 18 private static Logger logger = LoggerFactory.getLogger(TreeUtils.class); 19 20 /** 21 * ==================================================================== 22 *函 数 名: 23 *@param parent 24 *@param treeDataList 25 *@return 26 *功 能: 通过父节点获取子节点生成树形结构数据 27 ---------------------------------------------------------------------- 28 *修改记录 : 29 *日 期 版本 修改人 修改内容 30 *2017年8月31日 v0.0.1 揣怀梦想的猪 创建 31 ==================================================================== 32 */ 33 public static <T extends Object> List<T> treeNode(String parent, List<T> treeDataList) { 34 List<T> trees = null; 35 try { 36 if (trees == null) { 37 trees = new ArrayList<T>(); 38 } 39 40 if (treeDataList == null) { 41 return trees; 42 } 43 44 for (T t : treeDataList) { 45 if (getFiledVal(t,PARENT_FIELD_NAME).equals(parent)) { 46 setFiledVal(t,COLUMN_CHILDREN,treeNode(getFiledVal(t,COLUMN_ID_LOWCASE), treeDataList)); 47 trees.add(t); 48 } 49 } 50 } catch (Exception e) { 51 logger.error("递归生成树节点错误: " + e); 52 } 53 54 return trees; 55 } 56 57 58 public static <T extends Object> List<T> treeNodeList(String parent, List<T> treeDataList){ 59 return treeNodeList(parent, treeDataList,null); 60 } 61 62 63 /** 64 * ==================================================================== 65 *函 数 名: 66 *@param parent 传入当前节点名称 67 *@param treeDataList 68 * @return 69 *@return 70 *功 能: 通过父节点获取子节点返回列表结构数据 71 ---------------------------------------------------------------------- 72 *修改记录 : 73 *日 期 版本 修改人 修改内容 74 *2017年8月31日 v0.0.1 揣怀梦想的猪 创建 75 ==================================================================== 76 */ 77 private static <T extends Object> List<T> treeNodeList(String parent, List<T> treeDataList,List<T> trees) { 78 try { 79 80 if (treeDataList == null) { 81 return trees; 82 } 83 84 for (T t : treeDataList) { 85 if (getFiledVal(t,PARENT_FIELD_NAME).equals(parent)) { 86 trees.add(t); 87 treeNodeList(getFiledVal(t,COLUMN_ID_LOWCASE), treeDataList,trees); 88 } 89 } 90 } catch (Exception e) { 91 logger.error("递归生成树节点错误: " + e); 92 } 93 94 return trees; 95 } 96 97 98 public static <T extends Object> Map<String, T> childToParentNode(String parent, List<T> treeDataList){ 99 return childToParentNode(parent,treeDataList,null); 100 } 101 102 /** 103 * ==================================================================== 104 *函 数 名: 105 *@param parent 传入子节点对应的上级节点 106 *@param treeDataList 数据源 107 *@param trees 获取到的父节点数据 108 *@param user 109 *@return 110 *功 能:通过子节点获取到对应父节点数据 111 ---------------------------------------------------------------------- 112 *修改记录 : 113 *日 期 版本 修改人 修改内容 114 *2017年8月31日 v0.0.1 揣怀梦想的猪 创建 115 ==================================================================== 116 */ 117 public static <T extends Object> Map<String, T> childToParentNode(String parent, List<T> treeDataList, 118 Map<String, T> trees) { 119 try { 120 if (trees == null) { 121 trees = new HashMap<String, T>(); 122 } 123 124 if (treeDataList == null) { 125 return trees; 126 } 127 128 for (T t : treeDataList) { 129 if (getFiledVal(t, COLUMN_ID_LOWCASE).equals(parent)) { 130 trees.put(getFiledVal(t, COLUMN_ID_LOWCASE), t); 131 childToParentNode(getFiledVal(t, PARENT_FIELD_NAME), treeDataList, trees); 132 break; 133 } 134 } 135 } catch (Exception e) { 136 logger.error("执行childToParentNode时发生错误: " + e); 137 } 138 139 return trees; 140 } 141 142 /** 143 * ==================================================================== 144 *函 数 名: 145 *@param t 146 *@param name 147 *@return 148 *功 能: 获取字段值 149 ---------------------------------------------------------------------- 150 *修改记录 : 151 *日 期 版本 修改人 修改内容 152 *2017年9月6日 v0.0.1 揣怀梦想的猪 创建 153 ==================================================================== 154 */ 155 private static <T extends Object> String getFiledVal(T t, String name) { 156 try { 157 Field[] fields = t.getClass().getDeclaredFields(); 158 for (int i = 0,j=fields.length; i <j ; i++) { 159 String fieldName = fields[i].getName(); 160 if (name.equals(fieldName)) { 161 fields[i].setAccessible(true); 162 if (fields[i].getType().getName().equals(java.lang.String.class.getName())) { 163 // String type 164 Object obj= fields[i].get(t); 165 if(obj==null){ 166 return ""; 167 }else{ 168 return obj.toString(); 169 } 170 } else if (fields[i].getType().getName().equals(java.lang.Integer.class.getName()) 171 || fields[i].getType().getName().equals("int")) { 172 // Integer type 173 Object obj=fields[i].get(t); 174 if(obj==null){ 175 return ""; 176 }else{ 177 return String.valueOf(obj); 178 } 179 } 180 } 181 } 182 } catch (Exception ex) { 183 ex.printStackTrace(); 184 } 185 186 return ""; 187 } 188 189 /** 190 * ==================================================================== 191 *函 数 名: 192 *@param t 193 *@param name 194 *@param value 195 *功 能: 196 ---------------------------------------------------------------------- 197 *修改记录 : 198 *日 期 版本 修改人 修改内容 199 *2017年9月6日 v0.0.1 揣怀梦想的猪 创建 200 ==================================================================== 201 */ 202 public static <T extends Object> void setFiledVal(T t, String name, List<T> list) { 203 try { 204 Field[] fields = t.getClass().getDeclaredFields(); 205 for (int i = 0; i < fields.length; i++) { 206 fields[i].setAccessible(true); 207 if (name.equals(fields[i].getName())) { 208 fields[i].set(t, list); 209 break; 210 } 211 } 212 } catch (Exception e) { 213 e.printStackTrace(); 214 } 215 } 216 217 public static void main(String[] args) { 218 ScmMaterialCategoryVo vo=new ScmMaterialCategoryVo(); 219 List<ScmMaterialCategoryVo> list=new ArrayList<>(); 220 ScmMaterialCategoryVo temp=new ScmMaterialCategoryVo(); 221 temp.setCategoryCode("测试赛"); 222 list.add(temp); 223 setFiledVal(vo, "children", list); 224 System.out.println(vo); 225 } 226 }