@Data
@Accessors(chain = true)
public class Dept {
private String code;
private String name;
private String parentCode;
private List<Dept> item;
private int userNum;
private List<User> userItem;
}
@Data
@Accessors(chain = true)
public class User {
private String code;
private String name;
private String deptCode;
}
public class TreeTest {
public static void main(String[] args) {
List<Dept> dept = initDept();
List<User> user = initUser();
List<Dept> tree = tree(dept, user, true);
System.out.println(JsonUtils.beanToJson(tree));
// https://www.sojson.com/simple_json.html
}
/**
* 用戶與部門樹形結構
*
* @param dept 部門集合
* @param user 用戶集合
* @param clearZero 是否 清理用戶為0的部門
* @return
*/
private static List<Dept> tree(List<Dept> dept, List<User> user, boolean clearZero) {
List<Dept> tree = new ArrayList<>();
// 部門編碼與用戶集合鍵值對 deptcode - userList
Map<String, List<User>> deptUserMap = user.stream().collect(Collectors.groupingBy(User::getDeptCode));
// 部門編碼與部門鍵值對 deptcode - dept
Map<String, Dept> deptMap = dept.stream().collect(Collectors.toMap(Dept::getCode, Dept -> Dept));
dept.stream().forEach(d -> {
// 放入用戶集合和數量
List<User> deptlist = deptUserMap.get(d.getCode());
if (deptlist != null) {
d.setUserItem(deptlist);
d.setUserNum(deptlist.size());
}
// 獲取上級,如無上級則為頂級
Dept parent = deptMap.get(d.getParentCode());
if (parent != null) {
List<Dept> items = parent.getItem();
if (items == null) {
items = new ArrayList<>();
}
items.add(d);
// 數量逐層累計
parent.setUserNum(parent.getUserNum() + d.getUserNum());
parent.setItem(items);
} else {
tree.add(d);
}
});
if (clearZero) {
clearZeroDept(tree);
}
return tree;
}
/**
* 清理用戶為0的部門
*
* @param tree
*/
private static void clearZeroDept(List<Dept> tree) {
for (Iterator<Dept> iterator = tree.iterator(); iterator.hasNext();) {
Dept dept = iterator.next();
if (dept.getUserNum() == 0) {
iterator.remove();
}
if (dept.getItem() != null) {
clearZeroDept(dept.getItem());
}
}
}
/**
* 初始化用戶
*
* @return
*/
private static List<User> initUser() {
List<User> userList = new ArrayList<>();
User u1 = new User().setCode("2001").setName("張三").setDeptCode("01");
User u2 = new User().setCode("2002").setName("李四").setDeptCode("0201");
User u3 = new User().setCode("2003").setName("王五").setDeptCode("0201");
User u4 = new User().setCode("2004").setName("趙六").setDeptCode("0201");
userList.add(u1);
userList.add(u2);
userList.add(u3);
userList.add(u4);
return userList;
}
/**
* 初始化部門
*
* @return
*/
private static List<Dept> initDept() {
List<Dept> deptList = new ArrayList<>();
Dept sjb = new Dept().setCode("01").setName("設計部").setParentCode("-1");
Dept kfb = new Dept().setCode("02").setName("開發(fā)部").setParentCode("-1");
Dept kfb1 = new Dept().setCode("0201").setName("開發(fā)組1").setParentCode("02");
Dept kfb2 = new Dept().setCode("0202").setName("開發(fā)組2").setParentCode("02");
Dept kfb22 = new Dept().setCode("020201").setName("開發(fā)組2-1").setParentCode("0202");
deptList.add(sjb);
deptList.add(kfb);
deptList.add(kfb1);
deptList.add(kfb2);
deptList.add(kfb22);
return deptList;
}
}
待完善詳細說明