这篇文章主要介绍“Java简单VO的树形构建生成算法怎么使用”,在日常操作中,相信很多人在Java简单VO的树形构建生成算法怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java简单VO的树形构建生成算法怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
/** * 把一个 list的集合,根据父级属性和子集属性 分析称 树状 * * @param vos * @param idField - vo的父id对应的属性名(只支持 数字或字符串!!!!!) * @param parentField - 父id的属性(只支持 数字或字符串!!!!!) * @param childField - 子集合的属性名 (支持 java.util.Collection 或 数组) * @param <T> * @return */public static <T> List<T> toTree(List<T> vos, String idField, String parentField, String childField) { if (CollUtil.isEmpty(vos)) { return vos; } //缓存 ,快速查找父vo的 HashMap<Object, T> allMap = Maps.newHashMapWithExpectedSize(vos.size()); for (T vo : vos) { allMap.put(ReflectUtil.getFieldValue(vo, idField), vo); } ArrayList<T> list = Lists.newArrayListWithCapacity(vos.size()); Object idValue; Object pValue; Object cValue; Collection<T> childs; Collection<T> pChilds; List<T> directChild; HashMap<Object, Collection<T>> id2Childs = Maps.newHashMapWithExpectedSize(vos.size()); for (T vo : vos) { //拿到 id idValue = ReflectUtil.getFieldValue(vo, idField); //拿到当前vo的 父id pValue = ReflectUtil.getFieldValue(vo, parentField); childs = id2Childs.get(idValue); if (childs == null) { childs = Sets.newHashSetWithExpectedSize(vos.size()); id2Childs.put(idValue, childs); } pChilds = id2Childs.get(pValue); if (pChilds == null) { pChilds = Sets.newHashSetWithExpectedSize(vos.size()); id2Childs.put(pValue, pChilds); } directChild = findDirectChild(vos, idValue, parentField); childs.addAll(directChild); if (pValue == null || !allMap.containsKey(pValue)) { ///没有父id 根目录! list.add(vo); } else { pChilds.add(vo); } } Class<?> aClass = list.get(0).getClass(); Field childF = ReflectUtil.getField(aClass, childField); boolean isList = Collection.class.isAssignableFrom(childF.getType()); for (T vo : vos) { //拿到 id idValue = ReflectUtil.getFieldValue(vo, idField); childs = id2Childs.get(idValue); if (childs != null) { if (isList) { ReflectUtil.setFieldValue(vo, childF, childs); } else { ReflectUtil.setFieldValue(vo, childF, toArray(childs)); } } } return list;}/** * 集合转换成数组,数组类型是集合里元素的类型 * @param vos * @param <T> * @return */public static <T> T[] toArray(Collection<T> vos) { Class<?> aClass = vos.iterator().next().getClass(); T[] os = (T[]) Array.newInstance(aClass, vos.size()); Iterator<T> iterator = vos.iterator(); int i = 0; while (iterator.hasNext()) { os[i++] = iterator.next(); } return os;}/** * 把一个 list的集合,根据父级属性和父id,找到 他的直系第一级孩子 * * @param vos * @param id * @param parentField * @param <T> * @return */public static <T> List<T> findDirectChild(List<T> vos, Object id, String parentField) { if (CollUtil.isEmpty(vos)) { return Collections.emptyList(); } ArrayList<T> list = Lists.newArrayListWithCapacity(vos.size()); Object pValue; for (T vo : vos) { //拿到当前vo的 父id pValue = ReflectUtil.getFieldValue(vo, parentField); if (pValue == id || id.equals(pValue)) { list.add(vo); } } return list;}
到此,关于“Java简单VO的树形构建生成算法怎么使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。