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 }