您好,登錄后才能下訂單哦!
這篇文章主要介紹“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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。