JAVA 获取LDAP的AD部门目录并转换为树结构以及部门和用户的逻辑关联操作,文件夹目录转树结构

博主Garc我不容易,转载请标明源处谢谢!

本帖子不叙述如何使用LDAP以及连接LDAP操作,具体请百度或者CSDN搜索

AD域账户信息内容格式如下:

{mail=mail:123@qq.com,mobile=mobile:13422231122,name=name:张三,department=department:光速研发部门,samaccountname=sAMAccountName:szhang,canonicalname=canonicalName:乐蛙/业务运营/系统开发部}

文件夹目录也可以适用的转树结构操作

一、部门树结构转换

1.首先获取所有的canonicalName 部门目录结构,封装进List<String>集合

例如:

乐蛙/业务运营/系统开发部/张三

乐蛙/业务运营/系统开发部/相机部门/王五

乐蛙/业务运营/系统开发部/相机部门/开发/李四

乐蛙/业务运营/系统开发部/相机部门/测试/王二

乐蛙/业务运营/系统开发部/桌面部门/小明

乐蛙/业务运营/系统开发部/桌面部门/开发/小王

乐蛙/业务运营/系统开发部/桌面部门/测试/小李

2.遍历集合,一条一条解析封装为树结构直接上代码,需要的自己分析逻辑

private static Set<Department> getDepartmentThree(List<String> list){
   Set<Department> deps = new HashSet<>();
   for(String cname:list){
       //去除路径中的人名
       String path = cname.substring(0,cname.lastInfexOf("/"))
       String[]uri = path.split("/");
       resolver(deps,uri,0);
   }
   return deps;
}

private static void resolver(Set<Department> deps,String[]uri,int i){
   //封装父级部门
   Department dep = getDeparment(uri,i);
   //对象contains ,因为部门对象重写了equals
   if(!deps.contains(dep)){
       if(dep!=null){
          deps.add(dep);
       }
   }else{
        for(Department dp:deps){
            if(dep.getName().equals(dp.getName)){
               resolver(dp.getChildren(),uri,++i);
            }
        }
   }
}

private static Department getDeparment(String[]uri,int i){
   if(uri.length<=i){
      return null;
   }

   Department  ad = new Department();
   ad.setName(uri[i]);
   StringBuffer sb = new StringBuffer();
   for(int a=0;a<=i;a++){
       if(a==i){
         sb.append(uri[a]);
       }else{
         sb.append(uri[a]).append("/");
       }
   }
   ad.setCanonicalName(sb.toString());
   Department dep = getDeparment(uri,++i);
   if(dep!=null){
      ad.getChildren().add(a);
   }
   return ad;
}

equals和hashcode重写原因讲解 :

equals :是用来规定该对象使用什么规则(参数调节)判断是否相等,例如对象的对比和集合contains判断是否存在的时候。

hashcode:主要是因为用了Set集合的原因,如果不用set集合,可以不需要写。hashcode重写是为了定义对象的唯一规则,这里使用id、name、canonicalName三个参数表示唯一。这样生成的hash值就不会重复,所以set集合是不能重复的。

@Setter
@Getter
public class Department{

    private Long id;
 
    private String name;

    private Long parentId;

    private String canonicalName;

    private Set<Department> children = new HashSet<>();

    public boolean equals(Object o){
       if(this==o){
          return true; 
       }
       if(o == null || getClass()!=o.getClass()){
          return false;
       }
       Department that = (Department)o;
       return Objects.equals(name,that.name)
    }

    @Override
    public int hashCode() {
        return Objects.hash(id,name,canonicalName);
    }
}

代码执行完成最后结果:

--乐蛙

  -- 业务运营

       --系统开发部

            --相机部门

                  --开发

                  --测试

            --桌面部门

                  --开发

                  --测试

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qensq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值