题目原型:

有一张标准的树状结构表,里面有Structure_Id和 Parent_Id两个关键列,记录了结点的父子关系。现在要求添加一个字段为 Structure_Code ,标记为 三位一个节点关系,比如 第一级的为 001,002,第二级的为 001 001 , 001 002等,以此类推。

现在添加了这样一列:

JAVA组程序优化综合考试试题

想要的是这样的:

JAVA组程序优化综合考试试题

为什么要这样的东西呢?因为这列中可以描述:它的父亲是谁,爷爷是谁,太爷爷是谁,祖先是谁,当然也可以描述它的所有孩子有哪些,是居家必备,出门旅行的好东西啊!!!做树状设计时强烈推荐。

 

那么如何处理呢??这是个算法问题,请大家自行设计一下,我们对比一下执行效率。我的答案是5K条左右的数据,共需0.5秒。如果你的算法更优,请告诉我。

 我的思路,不要先看啊,请自行设计一下。

解决思路:

1、定义一个NodeBean,包括Structure_ID,Parent_ID,Structure_Code,Child_Count四个属性

2、创建一个数据结构var dict=new Dictionary<String, NodeBean>();

3、采用DataAdapter一次性将整表读入到内存,存放到dict中。

4、初始化根结点:查询所有根结点,然后按Stucture_ID做为Key,查询到dict中的此实例,然后把对应的NodeBean四个属性分别给定值,Parent_ID=11111-1111-1111-1111,Child_Count=0,Sturcture_Code分别为 001,002,003... 020等。

5、定义一个栈,FILO的东西,http://blog.csdn.net/aladdinty/article/details/3506285

Stack<string> stack = new Stack<string>(); 这个栈用来装需要马上找到父亲的节点。

6、遍历dict,找到第一条记录对应的Structure_Code,如果是空的,那么表示需要填充值,添加到上面定义好的栈里。

7、查找到对应的Parent_ID,然后拿此Parent_ID为KEY去dict中查找上一级节点对应的Structure_Code,

8、如果找到了,那么就可以更改父节点的,Child_Count++,表示又有一个孩子回家了。把父亲的Structure_Code放在前面,后面根据Child_Count记录001,002,003

9、如果还是没有找到,那么继续加入到定义好的栈里。

10、循环检查栈里面是不是有东西,有的话,遍历每一个,因为特殊的数据结构栈,所以是FILO的,就是先进后出,这样就把爷爷结点先和太爷爷结点建立起了关系,把它移除,然后处理父亲,最后处理孩子的。

 

OK,至此这个Dictionary整理完成,我们重新组装成SQL,一次性事务提交到数据库即可了。

 
View Code

相关文章:

  • 2021-05-31
  • 2021-07-15
  • 2021-11-23
  • 2022-12-23
  • 2022-01-01
  • 2021-11-27
  • 2022-12-23
  • 2021-09-20
猜你喜欢
  • 2021-04-21
  • 2022-12-23
  • 2022-02-08
  • 2021-06-13
  • 2021-12-22
  • 2021-10-28
相关资源
相似解决方案