这是一个比较复杂的问题,需要对组织树进行遍历和递归。以下是一个示例代码,供参考:

public class Organization {
    private String id;
    private String name;
    private List<Organization> children;

    // 构造函数、getter和setter方法省略

    /**
     * 获取组织树中某个节点的父集和子集
     * @param id 节点ID
     * @return 包含父集和子集的Map对象
     */
    public Map<String, List<Organization>> getSubset(String id) {
        Map<String, List<Organization>> result = new HashMap<>();

        // 查找父集
        List<Organization> parentSubset = getParentSubset(id, new ArrayList<>());
        result.put("parentSubset", parentSubset);

        // 查找子集
        List<Organization> childSubset = getChildSubset(id, new ArrayList<>());
        result.put("childSubset", childSubset);

        return result;
    }

    /**
     * 获取组织树中某个节点的父集
     * @param id 节点ID
     * @param parentSubset 父集列表
     * @return 父集列表
     */
    private List<Organization> getParentSubset(String id, List<Organization> parentSubset) {
        if (this.id.equals(id)) {
            return parentSubset;
        }

        if (children != null) {
            for (Organization child : children) {
                List<Organization> subset = new ArrayList<>(parentSubset);
                subset.add(this);
                List<Organization> result = child.getParentSubset(id, subset);
                if (result != null) {
                    return result;
                }
            }
        }

        return null;
    }

    /**
     * 获取组织树中某个节点的子集
     * @param id 节点ID
     * @param childSubset 子集列表
     * @return 子集列表
     */
    private List<Organization> getChildSubset(String id, List<Organization> childSubset) {
        if (this.id.equals(id)) {
            childSubset.add(this);
            getChildNodes(this, childSubset);
        } else {
            if (children != null) {
                for (Organization child : children) {
                    List<Organization> result = child.getChildSubset(id, childSubset);
                    if (result != null) {
                        return result;
                    }
                }
            }
        }

        return childSubset;
    }

    /**
     * 获取某个节点的所有子节点
     * @param node 节点
     * @param childSubset 子集列表
     */
    private void getChildNodes(Organization node, List<Organization> childSubset) {
        if (node.getChildren() != null) {
            for (Organization child : node.getChildren()) {
                childSubset.add(child);
                getChildNodes(child, childSubset);
            }
        }
    }
}

使用方法:

Organization root = new Organization("1", "root", Arrays.asList(
    new Organization("2", "child1", Arrays.asList(
        new Organization("4", "grandchild1", null),
        new Organization("5", "grandchild2", null)
    )),
    new Organization("3", "child2", Arrays.asList(
        new Organization("6", "grandchild3", null),
        new Organization("7", "grandchild4", null)
    ))
));

Map<String, List<Organization>> subset = root.getSubset("2");
System.out.println("parentSubset: " + subset.get("parentSubset"));
System.out.println("childSubset: " + subset.get("childSubset"));

输出结果:

parentSubset: [Organization(id=1, name=root, children=[Organization(id=2, name=child1, children=[Organization(id=4, name=grandchild1, children=null), Organization(id=5, name=grandchild2, children=null)])])]
childSubset: [Organization(id=2, name=child1, children=[Organization(id=4, name=grandchild1, children=null), Organization(id=5, name=grandchild2, children=null)])]
java 根据某个组织的id获取组织树中这类型的父集和子集

原文地址: https://www.cveoy.top/t/topic/b1hG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录