基于表示层次结构的字符串列表的java对象树

时间:2016-11-10 15:58:11

标签: java tree hierarchy

我有一个有趣的,据我所知,这不是最简单的任务。

我需要根据表示层次结构的字符串列表创建一个对象树。

例如,列表中的字符串是(实际上它可以是任何图形):

List<String> hierarchies;

1# 1#2# 1#2#3# 1#2#4# 1#2#4#5#

我上课:

class Tree {

    List<Tree> children;

    // here is getter

}

我有一些实施但只是为了开始。我不知道如何完成此代码。你能与我分享你的愿景吗?

提前致谢!

Tree tree = null;

for (String hierarchy : hierarchies) {

    if (hierarchy.equals("1#")) {
        tree = new Tree();
    } else {
        tree.getChildren().add(new Tree());
    }

}

return tree;

1 个答案:

答案 0 :(得分:0)

有很多可能的解决方案。没有复杂性,它可能看起来像:

public void testHierarchy() {

    List<String> hierarchies = new ArrayList<String>();

    hierarchies.add("1#");
    hierarchies.add("1#2#");
    hierarchies.add("1#2#3#");
    hierarchies.add("1#2#4#");
    hierarchies.add("1#2#4#5#");

    Tree root = new Tree();
    for (String hierarchy : hierarchies) {
        String[] elHierarchy = hierarchy.split("#");
        processLevel(elHierarchy, root);
    }
}

private void processLevel(String[] hierarchy, Tree rootTree) {

    if (null == rootTree.getValue() || "".equals(rootTree.getValue())) {
        rootTree.setValue(hierarchy[0]);
    }

    Tree nextChild = null;
    for (Tree child : rootTree.getChildren()) {
        if (child.getValue().equals(hierarchy[1])) {
            nextChild = child;
            break;
        }
    }

    if (hierarchy.length > 1) {
        if (null == nextChild) {
            nextChild = new Tree();
            nextChild.setValue(hierarchy[1]);
            rootTree.getChildren().add(nextChild);
        }
        String[] remainHierarchy = new String[hierarchy.length - 1];
        System.arraycopy(hierarchy, 1, remainHierarchy, 0,  remainHierarchy.length);
        processLevel(remainHierarchy, nextChild);
    }
}

private static class Tree {
    String  value;
    List<Tree>  children    = new ArrayList<SometestTest.Tree>();

    public List<Tree> getChildren() {

        return children;
    }

    public String getValue() {

        return value;
    }

    public void setValue(String value) {

        this.value = value;
    }

}

P.S。不是太优雅而是简单。

相关问题