日期:2014-05-18  浏览次数:20926 次

如何找到所有部门的最大的上级

class Department
{
private int id;
private String name;

//parent department
private Department parent;
}


每个部门都有其上级部门的引用


如果有多个部门是同级的,则共同上级为这些部门的parent部门
如果多个部门之间有隶属关系,则取这些部门中最大的部门

举例:有如下隶属关系

A
  A1
    B1
    B2
    B3
  A2
    B4
    B5
      C1
      C2
    B6
  A3
    B7
      C3
        D1
  A4
  A5
---------------

如果现在有部门:C1,C2,则共同最大的部门为:B5
如果现在有部门:B5,C1,C2,则共同最大的部门为:B5
如果现在有部门:B4,B5,C1,C2,则共同最大的部门为:A2

不用sql,如何用java实现

求思路
------解决方案--------------------
可以更改一下数据格式么,每个级别有个编码,对比可以直接得到最大的级别

------解决方案--------------------

找到当前元素的  所有  父节点 ,放入数组(数组第0个元素就是当前元素本身,最后一个元素就是最顶级的 节点)
同理,可得到另外的其他几组  数字数据
例如  A1  = {1,3,5};
          A2  = {2,4,5};
先假设有这两个吧,遍历A1(从最高位开始遍历),拿A1[2] 到A2 数组中寻找有没有A1[2] 元素,如果有,则继续遍历,用A1[1]在A2中寻找有没有,没有,则说明   A1[1]就是你要找的元素
------解决方案--------------------
我觉得,更改下部门编码好点。。
  比如第一个大部门100 下属部门10001(下属部门1000101、1000102……)、10002(下属部门1000201……)、10003 (下属部门1000301……)
第二个大部门200 下属部门20001(下属部门2000101、2000102……)、20002(下属部门2000201……)、10003 (下属部门2000301……)
   在生成编码时,自动++便可。。
------解决方案--------------------
递归调用祖先进行对比可以实现吧?
------解决方案--------------------
引用:
Quote: 引用:


找到当前元素的  所有  父节点 ,放入数组(数组第0个元素就是当前元素本身,最后一个元素就是最顶级的 节点)
同理,可得到另外的其他几组  数字数据
例如  A1  = {1,3,5};
          A2  = {2,4,5};
先假设有这两个吧,遍历A1(从最高位开始遍历),拿A1[2] 到A2 数组中寻找有没有A1[2] 元素,如果有,则继续遍历,用A1[1]在A2中寻找有没有,没有,则说明   A1[1]就是你要找的元素


没看懂,能说详细点吗?

按照你的例子:
如果现在有部门:C1,D1,则共同最大的部门为:
C1  :C1   B5   A2     A                   ( C1以及C1的所有父级节点 ,最顶级的节点在最后面)
D1  :D1   C3   B7    A3    A           ( D1  以及D1  的所有父级节点 ,最顶级的节点在最后面)
很明显,A就是你要的结果,
需要用循环实现,3个或以上的就多层循环而已
这样应该明白了吧