Java 部門與用戶員工的樹結構組裝


@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;
    }
}

待完善詳細說明

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。