首页 > 其他分享 >列表转树结构,获取节点到根的路径

列表转树结构,获取节点到根的路径

时间:2023-07-06 09:36:28浏览次数:31  
标签:return 树结构 areaCode List areaDict list 列表 节点

列表转树结构

逻辑上呈树结构的数据,诸如菜单,省市区,在数据库中单表存放,Java程序从数据库中读取出来这些数据时,是列表形式。列表转树结构使用双层for循环实现:

    /**
     * 节点组成树形结构,返回森林
     *
     * @param list      节点列表
     * @param predicate 定义树的根节点
     * @return 森林
     */
    static <T extends ITree<T>> List<T> toForest(List<T> list, Predicate<T> predicate) {
        for (T item : list) {
            List<T> children = list.stream()
                    .filter(c -> Objects.equals(c.getParentId(), item.getId()))
                    .collect(Collectors.toList());
            item.setChildren(children);
        }
        List<T> tree = list.stream().filter(predicate)
                .collect(Collectors.toList());
        return tree;
    }

获取节点至根的路径

使用递归的样例代码如下:

    /**
     * 例如 areaCode=130400时,返回河北省邯郸市
     * 例如 areaCode=130000时,返回河北省
     *
     * @param areaCode 省、市、区级编码
     * @return 从省级全名拼接到areaCode全名的路径
     */
    public String getPathFullname(String areaCode) {
        AreaDict areaDict = dao.findByAreaCode(areaCode).orElse(null);
        if (areaDict == null) return "";
        if (!COUNTRY_CODE.equals(areaDict.getParentCode())) {
            return getPathFullname(areaDict.getParentCode()) + areaDict.getFullname();
        }
        return areaDict.getFullname();
    }

可以优化为使用双层for循环,list保存中间的迭代结果的方式,替代递归。
伪代码:

function(areaCode){
  List list = new List();
  list.add(areaCode)
  while(list.tail is not root){
    list.add(parent(list.tail))
  }
  return list.reverse().join()
}

标签:return,树结构,areaCode,List,areaDict,list,列表,节点
From: https://www.cnblogs.com/windyWu/p/17531184.html

相关文章

  • 41. 散列表
    一、什么是散列表  散列表(HashTable,也叫哈希表),它是根据关键码值(keyvalue)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中的一个位置来访问记录,以加快查找算法。这个映射函数叫做散列函数,存放记录的数组叫做散列表。类型名称:散列表(HashTable)数据对象......
  • 用户列表查询对接后端
    1.找到与后端对接的接口文件现在是每一个方法做一个导出,我们希望每个文件做一个导出。default可以在里面定义多个方法在user.vue引入它我们希望页面一加载就调用一次,写一个构造函数,在构造函数中发起调用created()调用getUserList(),而getUserList()调用刚刚定义的use......
  • 用户列表查询接口
    1.UserController1:list的路径2:用户名(不是必须属性用required=false)3:电话号码(不是必须属性用required=false)4:分页参数(必填)5:每一页显示多少条(必填)6:定义一个条件构造器7:条件用户名(做一个非空判断)8:条件电话号码(做一个非空判断)9:new一个page对象10:......
  • cellos.20221115_030623类似的目录撑爆存储节点的root文件系统
    1、某Exadata客户,其中一个存储节点的根文件系统使用率超过90%,使用如下命令检查是哪些目录占用空间#du-sm*|sort-rn|head发现是/var/log目录下的东西占用大量空间。2、在/var/log目录下,存在大量cellos开头,但以日期结果的目录,这些目录占用大量磁盘空间。如下所示:drwxr-----7......
  • 59.有哪些情况必须用到成员列表初始化?作用是什么?
    59.有哪些情况必须用到成员列表初始化?作用是什么?1.必须使用成员初始化的四种情况①当初始化一个引用成员时;structMyClass{constintmya;int&myb;MyClass(inta,int&b):mya(a),myb(b){}~MyClass(){}};②当初始化一个非静态的常量成员时;int......
  • 58.类成员初始化方式?构造函数的执行顺序 ?为什么用成员初始化列表会快一些?
    58.类成员初始化方式?构造函数的执行顺序?为什么用成员初始化列表会快一些?1.类成员初始化方式1.1初始化方式一:默认时初始化如果类成员没有被显式初始化,将会使用默认初始化。默认初始化指没有提供初始化式的情况下,将使用默认值进行初始化。对于基本数据类型(如整数、浮点数等),默认......
  • el-table中的selectable的使用方法 tl-table中控制列表第一列 勾选框是否禁用
    el-table中的selectable的使用方法tl-table中控制列表第一列勾选框是否禁用原文链接:https://huaweicloud.csdn.net/63a004ccdacf622b8df912b8.htmlel-table中的selectable的使用方法html代码<el-table-columntype="selection"width="55":selectable="selec......
  • 第五天(登录+拦截器,员工列表实现,添加员工实现,员工信息修改,删除员工实现)
    登录+拦截器员工列表实现标蓝添加员工实现员工信息修改删除员工实现404及注销......
  • Python 元组转换为列表
    1.直接将元组转为列表tup=(21,19,11,46,18)print(tup)lt=list(tup)print(lt)输出(21,19,11,46,18)[21,19,11,46,18]2.将元组列表转为列表#Listoftupleinitializationlistoftuples=[("Apple",1),("Microsoft",2),("Amazon",......
  • python中如何简洁剔除列表中的特定值
    在Python中,可以使用列表推导式或filter函数来剔除列表中的特定值。方法一:使用列表推导式original_list=[1,2,3,4,5]exclude_value=3new_list=[xforxinoriginal_listifx!=exclude_value]print(new_list)#输出:[1,2,4,5]方法二:使用filter函数origi......