原题如下:

解题代码如下:

table1类:

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class table1{
  5. private String num;
  6. private String name;
  7. private String fatherNum;
  8. }

table2类:

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class table2{
  5. private String num;
  6. private String name;
  7. private String sheng;
  8. private String shi;
  9. private String qu;
  10. }

changeTable类:

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. class Node{
  5. //编号
  6. private String num;
  7. //名称
  8. private String name;
  9. //父节点
  10. private Node fatherNum;
  11. //子节点树
  12. private List<Node> sonNum;
  13. }
  14. @Data
  15. public class changeTable {
  16. //零散节点,key为编号
  17. private Map<String,Node> MapData = new HashMap<>();
  18. //结构同HashMap,list中存储的每个节点其形状都为树形,其中根为省节点
  19. private List<Node> treeData = new ArrayList<>();
  20. //处理完后生成的新表
  21. private List<table2> tab = new ArrayList<>();
  22. private void createTree(List<table1> datas) {
  23. for(table1 data : datas) {
  24. //为省列,直接添加到treeData中,形成树根
  25. if(data.getFatherNum()==null) {
  26. treeData.add(MapData.get(data.getNum()));
  27. }else {
  28. //当前节点中设置父亲点
  29. MapData.get(data.getNum()).setFatherNum(MapData.get(data.getFatherNum()));
  30. //父节点中设置孩子节点
  31. List<Node> sonNum = MapData.get(data.getFatherNum()).getSonNum();
  32. sonNum.add(MapData.get(data.getNum()));
  33. MapData.get(data.getFatherNum()).setSonNum(sonNum);
  34. }
  35. }
  36. }
  37. //生成零散节点,方便获取
  38. private void createMap(List<table1> datas) {
  39. for(table1 data:datas) {
  40. MapData.put(data.getNum(), new Node(data.getNum(),data.getName(),new Node(),new ArrayList<Node>()));
  41. }
  42. }
  43. //生成新表数据
  44. private void createTable2() {
  45. for(Node node : treeData) {
  46. //node为树根,0为深度
  47. createRow(node,);
  48. }
  49. }
  50. //使用深度优先遍历产生数据
  51. private void createRow(Node node,int depth) {
  52. //当能达到第三层(0层:省,1层:市,2层:区,3层:公司名),则新增数据
  53. if(depth==) {
  54. table2 table2 = new table2();
  55. table2.setNum(node.getNum());
  56. table2.setName(node.getName());
  57. table2.setQu(node.getFatherNum().getNum());
  58. table2.setShi(node.getFatherNum().getFatherNum().getNum());
  59. table2.setSheng(node.getFatherNum().getFatherNum().getFatherNum().getNum());
  60. tab.add(table2);
  61. }else {
  62. //遍历当前节点子节点树
  63. for(Node nod : node.getSonNum()) {
  64. createRow(nod,depth+);
  65. }
  66. }
  67. }
  68. public List<table2> getTable2(List<table1> dataList){
  69. createMap(dataList);
  70. createTree(dataList);
  71. createTable2();
  72. return tab;
  73. }
  74. }

Test类:

  1. public class Test {
  2. public static void main(String[] args) {
  3. //模拟查询数据库
  4. List<table1> dataList = new ArrayList<>();
  5. dataList.add(new table1("","江汉区XXX公司",""));
  6. dataList.add(new table1("","长沙市",""));
  7. dataList.add(new table1("","武汉市",""));
  8. dataList.add(new table1("","岳麓区",""));
  9. dataList.add(new table1("","湖北省",null));
  10. dataList.add(new table1("","岳麓区ZZZ公司",""));
  11. dataList.add(new table1("","湖南省",null));
  12. dataList.add(new table1("","江汉区",""));
  13. dataList.add(new table1("","江汉区YYY公司",""));
  14. //创建转换对象
  15. changeTable changeTable = new changeTable();
  16. //得到转换结果
  17. List<table2> table2s = changeTable.getTable2(dataList);
  18. for(table2 tab :table2s ) {
  19. System.out.println(tab);
  20. }
  21. }
  22. }

算法解析:

注释已经解释的非常详细了,具体过程我就不再叙述了。

其中table1与table2是两个po对象,而@data注解相当于被注解类中所有成员加上了get、set方法,@NoArgsConstructor为无参构造方法,@AllArgsConstructor为全参构造方法。

运行结果:

注意:当数据非常多时,这种设计将不再适用,因为将所有数据加载到内存中会导致栈溢出。这时可以先将数据库中所有省列查询出来,(省列没有上级编号,这就是很好的查询条件);接着循环遍历省列,根据遍历的省查询出下面所有市;然后遍历查询出来的所有市得到市下面的所有区;然后遍历区下面的所有公司,最后组装数据。虽然性能远不如一次性导入数据,但针对于数据量大时是非常好的解决办法。

设计一个A表数据抽取到B表的抽取过程的更多相关文章

  1. 取A表数据,关联B表任意一条数据

     表A=================== AID, AName 1 jack 2 mary 3 lily 表B================== BID, AID, BName 1 1 aaa ...

  2. SQL Server 的表数据简单操作(表数据查询)

    --表数据查询----数据的基本查询-- --数据简单的查询--select * | 字段名[,字段名2, ...] from 数据表名 [where 条件表达式] 例: use 商品管理数据库 go ...

  3. merge源表数据移植到目标表新表数据中

    merge into dbo.ak_SloteCardTimes a using(select RecordID,CardNO,SloteCardTime from dbo.Tb_CardDate b ...

  4. 【database】复制表数据到相同备份表

    目的及由来,因为数据库表都采取逻辑删除isDeleted=true/flase,但是之前有些报表或者其他的sql并没有在sql中指明此条件.为了不影响之前代码,所以: 1.数据库中创建一张相同的表,把 ...

  5. 获取B表数据添加到A表中作为一个下拉列表元素存在

    1.ProductController类里toedit方法内添加: ProductModel product = ProductModel.dao.findById(id); //通过id查找服务类 ...

  6. mysql把A表数据插入到B表数据的几种方法

    web开发中,我们经常需要将一个表的数据插入到另外一个表,有时还需要指定导入字段,设置只需要导入目标表中不存在的记录,虽然这些都可以在程序中拆分成简单sql来实现,但是用一个sql的话,会节省大量代码 ...

  7. java基于xml配置的通用excel单表数据导入组件(一、实际应用过程)

    主要应用技术:poi + betwixt + reflect 一.实际应用过程 1.创建与目标表结构一样,表名为‘{目标表名}_import’的临时表: 2.创建用于存储导入问题数据的表:t_impo ...

  8. 第三方控件netadvantage UltraWebGrid如何生成带加号多级表数据也就是带子表

    1.看代码不解释: ds.Relations.Add("fk", ds.Tables[0].Columns["Id"], ds.Tables[1].Column ...

  9. A表数据插入到B表(表结构不一致)

    D_A  有E\F\H 3字段 D_B 有 A\B\C\D\E\ID 字段 将 D_B 个别字段插入到D_A  表 INSERT INTO  D_A(E,F,H) select B,A,ID from ...

  10. Sql 将A表数据插入到B表

    A表和B表字段不同 --insert into B(Name,PersonalId,Education,IsDel) select Name, PersonId as PersonalId, ( ca ...

随机推荐

  1. 4.Sentinel源码分析— Sentinel是如何做到降级的?

    各位中秋节快乐啊,我觉得在这个月圆之夜有必要写一篇源码解析,以表示我内心的高兴~ Sentinel源码解析系列: 1.Sentinel源码分析-FlowRuleManager加载规则做了什么? 2. ...

  2. Django之模型层(2)

    Django之模型层(2) 一.创建模型 实例:我们来假定下面这些概念,字段和关系. 作者模型:一个作者由姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情 ...

  3. Java的初始化块及执行过程详解

    问题:Java对象初始化方式主要有哪几种?分别是什么?针对上面的问题,想必大家脑海中首先浮现出的答案是构造器,没错,构造器是Java中常用的对象初始化方式. 还有一种与构造器作用非常相似的是初始化块, ...

  4. 在 ABP vNext 中编写仓储单元测试的问题一则

    一.问题 新项目是基于 ABP vNext 框架进行开发的,所以我要求为每层编写单元测试.在同事为某个仓储编写单元测试的时候,发现了一个奇怪的问题.他的对某个聚合根的 A 字段进行了更新,随后对某个导 ...

  5. Android studio初次安装启动时弹出unable to access android sdk add-on list提示的解决方法

    一.问题描述 初次安装Android Studio,启动后,报错如下: unable to access android sdk add-on lis 如图: 二.原因分析 AS启动后,会在默认路径下 ...

  6. 大数据平台搭建 - cdh5.11.1 - hue安装及集成其他组件

    一.简介 hue是一个开源的apache hadoop ui系统,由cloudear desktop演化而来,最后cloudera公司将其贡献给了apache基金会的hadoop社区,它基于pytho ...

  7. opencv中IplImage* src = cvLoadImage,错误

    在调试这段代码时 IplImage* src = cvLoadImage("D:\\图像\\已处理 - 11.26\\1.jpg", 1); 提示一下错误 引发了异常: 读取访问权 ...

  8. 解析 HTTP 请求 header 错误

    1.org.apache.coyote.http11.Http11Processor.service 解析 HTTP 请求 header 错误 2.原因:在创建项目名称的时候,文件名不能带有中文,只能 ...

  9. NPOI导出数值格式设置(我是保留四位小数,不足补0)

    看了网上好多帖子,都是保留两位小数的,写法是: HSSFDataFormat.GetBuiltinFormat("0.00"); 于是想四位小数,就是多加两个00,变成: HSSF ...

  10. 给Xshell增加快速命令集

    一.显示快速命令栏 二.配置快速命令集 在工具中找到快速命令集 添加快速命令集 三.使用快速命令集