原题如下:

解题代码如下:

table1类:

 @Data
@NoArgsConstructor
@AllArgsConstructor
public class table1{
private String num;
private String name;
private String fatherNum;
}

table2类:

 @Data
@NoArgsConstructor
@AllArgsConstructor
public class table2{
private String num;
private String name;
private String sheng;
private String shi;
private String qu;
}

changeTable类:

 @Data
@NoArgsConstructor
@AllArgsConstructor
class Node{
//编号
private String num;
//名称
private String name;
//父节点
private Node fatherNum;
//子节点树
private List<Node> sonNum;
}
@Data
public class changeTable {
//零散节点,key为编号
private Map<String,Node> MapData = new HashMap<>();
//结构同HashMap,list中存储的每个节点其形状都为树形,其中根为省节点
private List<Node> treeData = new ArrayList<>();
//处理完后生成的新表
private List<table2> tab = new ArrayList<>();
private void createTree(List<table1> datas) {
for(table1 data : datas) {
//为省列,直接添加到treeData中,形成树根
if(data.getFatherNum()==null) {
treeData.add(MapData.get(data.getNum()));
}else {
//当前节点中设置父亲点
MapData.get(data.getNum()).setFatherNum(MapData.get(data.getFatherNum()));
//父节点中设置孩子节点
List<Node> sonNum = MapData.get(data.getFatherNum()).getSonNum();
sonNum.add(MapData.get(data.getNum()));
MapData.get(data.getFatherNum()).setSonNum(sonNum);
}
}
}
//生成零散节点,方便获取
private void createMap(List<table1> datas) {
for(table1 data:datas) {
MapData.put(data.getNum(), new Node(data.getNum(),data.getName(),new Node(),new ArrayList<Node>()));
}
}
//生成新表数据
private void createTable2() {
for(Node node : treeData) {
//node为树根,0为深度
createRow(node,);
}
}
//使用深度优先遍历产生数据
private void createRow(Node node,int depth) {
//当能达到第三层(0层:省,1层:市,2层:区,3层:公司名),则新增数据
if(depth==) {
table2 table2 = new table2();
table2.setNum(node.getNum());
table2.setName(node.getName());
table2.setQu(node.getFatherNum().getNum());
table2.setShi(node.getFatherNum().getFatherNum().getNum());
table2.setSheng(node.getFatherNum().getFatherNum().getFatherNum().getNum());
tab.add(table2);
}else {
//遍历当前节点子节点树
for(Node nod : node.getSonNum()) {
createRow(nod,depth+);
}
}
}
public List<table2> getTable2(List<table1> dataList){
createMap(dataList);
createTree(dataList);
createTable2();
return tab;
}
}

Test类:

 public class Test {
public static void main(String[] args) {
//模拟查询数据库
List<table1> dataList = new ArrayList<>();
dataList.add(new table1("","江汉区XXX公司",""));
dataList.add(new table1("","长沙市",""));
dataList.add(new table1("","武汉市",""));
dataList.add(new table1("","岳麓区",""));
dataList.add(new table1("","湖北省",null));
dataList.add(new table1("","岳麓区ZZZ公司",""));
dataList.add(new table1("","湖南省",null));
dataList.add(new table1("","江汉区",""));
dataList.add(new table1("","江汉区YYY公司",""));
//创建转换对象
changeTable changeTable = new changeTable();
//得到转换结果
List<table2> table2s = changeTable.getTable2(dataList);
for(table2 tab :table2s ) {
System.out.println(tab);
}
}
}

算法解析:

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

其中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. POJ-3662 Telephone Lines 二分+双端队列

    题目传送门 题意:有n个点, p条路,每条道路有个花费Li, 然后现在要建一条1-n的路线,然后可以选k条道路免费, 然后可以在剩下的道路中选择价格最高的边支付费用, 求这个答案最小. 题解: 二分答 ...

  2. codeforce 505 D. Mr. Kitayuta's Technology(tarjan+并查集)

    题目链接:http://codeforces.com/contest/505/problem/D 题解:先用tarjan缩点然后再用并查集注意下面这种情况 ‘ 这种情况只需要构成一个大环就行了,也就是 ...

  3. stm32f10x基于freeRTOS的低功耗实现

    0. 写在前面 没有太多时间更新,可能偶尔有时间就更新一些. 因为突然有项目用到了stm32f10x系列并且是电池驱动的,所以需要对功耗进行优化,其他CM3核心系列应该也同样适用. 1. 背景 Stm ...

  4. ~!#$%^&*这些符号怎么读? 当然是用英语(键盘特殊符号小结)

    ~!#$%^&*这些符号怎么读? 当然是用英语(键盘特殊符号小结)   感谢原文作者:http://www.360doc.com/content/14/0105/20/85007_342874 ...

  5. lambda表达式不同对象根据对象某个属性去重

    1.有时候有两个list对象,我们想要去重,比如: List<User> userList和List<Person>personList 想通过User的id和Person的i ...

  6. 面试官:服务器安装 JDK 还是 JRE?可以只安装 JRE 吗?

    前些日子有知友面试时被问到如题所示的问题,由于他之前没有准备到这些最最基础的知识,没有考虑过这个问题,所以被问到时竟一脸萌币,回答的不是很好.这道题主要考的是对 Java 基础知识的了解,有些同学可能 ...

  7. 这可能是国内最全面的char RNN注释

    char RNN代码来源于https://github.com/hzy46/Char-RNN-TensorFlow 前言 本人在学习char RNN的过程中,遇到了很多的问题,但是依然选择一行代码一行 ...

  8. KMP算法C代码

    贴上C代码作参考,关于算法,可以参考网上的博文,但不要参考太多,一两篇相近的即可. #include <stdio.h> #include <stdlib.h> #includ ...

  9. 简单的Socket通信(简单的在线聊天)---winform

    注:本博客适合刚开始学习winform程序的初学者,大牛请绕道(跪求大牛指导文中不足) .....10w字废话自动省略,直接开始正题. 首先从最基本的建立winform开始(本项目用的Vs2017) ...

  10. [3]尝试用Unity3d制作一个王者荣耀(持续更新)->选择英雄-(中)

    如果已经看过本章节:目录传送门:这是目录鸭~ 上节内容写了Actor管理器,那么这一节让我们先创建一个角色.(此章节开始加速...) 1.制作角色展示AssetBundle: 提取农药某个展示模型(S ...