千家信息网

Java简单VO的树形构建生成算法怎么使用

发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,这篇文章主要介绍"Java简单VO的树形构建生成算法怎么使用",在日常操作中,相信很多人在Java简单VO的树形构建生成算法怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对
千家信息网最后更新 2024年11月20日Java简单VO的树形构建生成算法怎么使用

这篇文章主要介绍"Java简单VO的树形构建生成算法怎么使用",在日常操作中,相信很多人在Java简单VO的树形构建生成算法怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Java简单VO的树形构建生成算法怎么使用"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

/** * 把一个 list的集合,根据父级属性和子集属性 分析称 树状 * * @param vos * @param idField     - vo的父id对应的属性名(只支持 数字或字符串!!!!!) * @param parentField - 父id的属性(只支持 数字或字符串!!!!!) * @param childField  - 子集合的属性名 (支持 java.util.Collection 或 数组) * @param  * @return */public static  List toTree(List vos, String idField, String parentField, String childField) {    if (CollUtil.isEmpty(vos)) {        return vos;    }    //缓存 ,快速查找父vo的    HashMap allMap = Maps.newHashMapWithExpectedSize(vos.size());    for (T vo : vos) {        allMap.put(ReflectUtil.getFieldValue(vo, idField), vo);    }    ArrayList list = Lists.newArrayListWithCapacity(vos.size());    Object idValue;    Object pValue;    Object cValue;    Collection childs;    Collection pChilds;    List directChild;    HashMap> 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  * @return */public static  T[] toArray(Collection vos) {    Class aClass = vos.iterator().next().getClass();    T[] os = (T[]) Array.newInstance(aClass, vos.size());    Iterator iterator = vos.iterator();    int i = 0;    while (iterator.hasNext()) {        os[i++] = iterator.next();    }    return os;}/** * 把一个 list的集合,根据父级属性和父id,找到 他的直系第一级孩子 * * @param vos * @param id * @param parentField * @param  * @return */public static  List findDirectChild(List vos, Object id, String parentField) {    if (CollUtil.isEmpty(vos)) {        return Collections.emptyList();    }    ArrayList 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的树形构建生成算法怎么使用"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0