给定一组随机分布的键,每个键映射到一组值,如何将其转换为多棵树?
示例数据集
nb2=>{nc2 nd2}
ND1=>{NG1 NH1}
NA1=>{NB1}
nb1=>{nc1 nd1 ne1}
Na2=>{Nb2}
nc1=>{nf1}
NE1=>{NI1 NJ1 NK1}
NA1的结果树
NA1号
`--NB1公司
|--NC1号
|`--NF1
|--新数据1
||--下一代
|`--NH1
`--新能源1
|--NI1公司
|--新泽西州
`--NK1号
na2生成树

`--NB2型
|--NC2号
`--钕

最佳答案

我不知道有什么库方法可以实现这种转换我会这样做的我觉得很简单。

public class Tree {
    public Tree(String key) {
        // ...
    }
    public void addChild(Tree child) {
        // ...
    }
}

public Set<Tree> transform(Map<String, List<String>> input) {
    // Potential tree roots.  We start with all LHS keys as potential roots,
    // and eliminate them when we see their keys on the RHS.
    Set<String> roots = new HashSet<String>(input.keySet());

    // This map associates keys with the tree nodes that we create for them
    Map<String, Tree> map = new HashMap<String, Tree>();

    for (Map.Entry<String, List<String>> entry : input.entrySet()) {
        String key = entry.getKey();
        List<String> childKeys = entry.getValue();
        Tree tree = map.get(key);
        if (tree == null) {
            tree = new Tree(key);
            map.put(key, tree);
        }
        for (String childKey : childKeys) {
            roots.remove(childKey);
            Tree child = map.get(childKey);
            if (child == null) {
                child = new Tree(childKey);
                map.put(childKey, child);
            }
            tree.addChild(child);
        }
    }
    Set<Tree> res = new HashSet<Tree>(roots.size());
    for (String key : roots) {
        res.add(map.get(key));
    }
    return res;
}

编辑:注意,如果输入代表一组DAG(有向无环图),此算法将“工作”。然而,我刚刚意识到,生成的一组树将共享输入数据中任何公共子树的treenode实例。
请注意,我没有调试此代码:-)

10-06 08:32