树结构数据查询父子级

数据库一般会提供树形结构的数据的查询函数,但是可能需要额外的配置,偶尔会因为设计上的失误,会导致写查询语句跟吃屎一样难受,数据量不大的情况,索性全查在代码中进行组合

import java.util.*;

/**
 * @author css
 * @data 2019/6/24 10:33
 */
public class Test<T> {
    private List<Node<T>> list = new ArrayList<>();

    public class Node<T> {
        Object id;
        Object pid;
        String name;
        T t;

        Node<T> parent;
        LinkedList<Node<T>> children = new LinkedList<>();

        @Override
        public String toString() {
            return "Node{" +
                    "id=" + id +
                    ", pid=" + pid +
                    ", name=" + name +
                    ", t=" + t +
                    ", children=" + children +
                    ‘}‘;
        }
    }

    public void add(Object id, Object pid, String name, T t) {
        Node<T> node = new Node<>();
        node.id = id;
        node.pid = pid;
        node.name = name;
        node.t = t;
        list.add(node);
    }

    public Node<T> toTree(Object root) {
        for (Node<T> i : list) {
            for (Node<T> j : list) {
                if (i.id.equals(j.pid)) {
                    i.children.add(j);
                    j.parent = i;
                }
            }
        }
        for (Node<T> i : list) {
            if (root.equals(i.id)) {
                return i;
            }
        }
        return null;
    }

    public List<T> getParent(Node<T> node) {
        Node<T> p = node.parent;
        if (p == null) {
            return null;
        } else {
            List<T> list = new ArrayList<>();
            while (p != null) {
                list.add(p.t);
                p = p.parent;
            }
            return list;
        }
    }

    public List<T> getChildren(Node<T> node) {
        LinkedList<Node<T>> c = new LinkedList<>(node.children);
        if (c.isEmpty()) {
            return null;
        } else {
            List<T> list = new ArrayList<>(c.size());
            Node<T> e;
            while (!c.isEmpty()) {
                e = c.pollFirst();
                list.add(e.t);
                if (!e.children.isEmpty()) {
                    c.addAll(e.children);
                }
            }
            return list;
        }
    }

    public static void main(String[] args) {
        Test<String> t = new Test<>();
        t.add(1, null, "1000", "node1");
        t.add(2, 1, "1001", "node2");
        t.add(3, 2, "1002", "node3");
        t.add(4, 2, "1003", "node4");
        Test.Node n = t.toTree(1);
        System.out.println(t.getChildren(n));
    }
}

原文地址:https://www.cnblogs.com/chenss15060100790/p/11122154.html

时间: 2024-08-12 21:08:59

树结构数据查询父子级的相关文章

处理百万级以上的数据查询提高效率的办法

1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from

AngularJs 父子级Controller传递数据

<div ng-controller="MyAccountCtrl"> <div ng-controller="TransferCtrl"> ............. </div> </div> // 子级传递数据给父级 // 子级传递 $scope.checkLoggedIn = function(type) { $scope.transferType = type; $scope.$emit('transfer.

第一章: 在RDB中的树结构数据

第一章: 在RDB中的树结构数据 在本章中,我将写一个基本的知识来理解这个问题 一  模型的作用 RBD处理树模型的作用总结为两点: 1  在RDB表中保存树的数据 2  效率的查询节点的相关节点 1  在RDB表中保存树的数据 我们可以定义的标准,该模型是否具有存储层次数据的功能 可以由保存的所有节点再现原有的层次结构 如果不能通过保存的数据再现原有的树结构,就不能说这个模型实现了树. 2  效率的查询节点的相关节点 通常,我们将数据保存到数据库中进行搜索,数据中保存了分层数据,可能会查询任何

树结构的查询start with 子句

oracle start with connect by 用法 oracle中 connect by prior 递归算法 Oracle中start with...connect by prior子句用法 connect by 是结构化查询中用到的,其基本语法是: select ... from tablename start with 条件1 connect by 条件2 where 条件3; 例: select * from table start with org_id = 'HBHqfW

轻松构建复杂数据集,永洪自服务数据查询功能详解

现在的报告样式多种多样,越来越炫酷以至于让人应接不暇.如果想从数据结果上进行溯源,由于数据处理过程盘根错节且技术性过强,让业务人员捉襟见肘.如何让业务人员清晰可视化的看到数据从来源.加工到展示的一步步操作,永洪科技为您排忧解难. 今天这篇文章,主要介绍永洪自服务数据查询,这种方式提供强大.便捷的数据准备和整合方式,用户可以通过在图形化界面上只需要进行简单的拖拽和可视化的操作,便可以构建复杂的数据集. 数据准备过程主要涉及三类功能节点:输入节点(用于实现数据库表连接.导入EXCEL数据.创建内嵌数

数据库中树结构数据,转换为Java对象树结构( 多叉树结构 )

总体就是图所表示所表示的转换,由数据库 => Java对象转换,代码比较简单,但对数据库压力可以大一点,多次查询. 主要是对象之间建立关联 No.2 : MapToTree() 思路为: 用pid(父id)作分组 ,这样每一个组的父节点是同一样,换句话说就是同一分组里,所有节点pid是相同的. 这样就针对分组操作,建立关联. 用Map做封装,key为父ID, value为分组List 用到了QueryRunner 这个是数据库工具,只要在网上找,下载就可以,能直接查询List. QueryRun

数据查询操作

一.模型类 class ArticleManager(models.Manager): def archive(self, **kwargs): l = [] month_list = [] for i in self.filter(**kwargs).values("create_time"): date = i['create_time'] month_list.append(date.month) t = date.strftime("%Y-%m-%d") i

一道关于数据库(经典父子级 ID 关联)更新题,大家帮忙想想还有其它解决思路没有?

昨天,一同事发过来的一道数据库题目,就是哪种经典的父子级 ID 在同一数据库表中设计类型.需要在原表中添加一个字段,同时,将该节点的父子级详细信息插入到原表新增的一字段中,具体效果如下图. AreaCode .AreaName.ParentCode (原表三字段). Content __新增字段,更新该 AreaCode 下所有父级菜单信息至新增至原表的 Content 字段下面,用红线框起来(意思应该讲明白了吧.) AreaCode:地区 ID   AreaName:地区介绍    Paren

ThinkPHP 关联模型中查询某条记录的父级(非查询子级)

数据表 id      cat_name      cat_pid 76     手机.数码     0 84     手机配件        76 86     蓝牙耳机        84 从属关系 : 蓝牙耳机  =>(上一级)  手机配件   =>(上一级)  手机.数码(顶级了) 关联模型 namespace Admin\Model; use Think\Model\RelationModel; class CategoryModel extends RelationModel {