博主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);
}
}
代码执行完成最后结果:
--乐蛙
-- 业务运营
--系统开发部
--相机部门
--开发
--测试
--桌面部门
--开发
--测试