遍历不同类型对象的树

时间:2012-12-06 10:07:09

标签: java object tree

我有一个由不同类型的对象组成的树,例如

   Tree
    |  \
  apple  cat
    |  \
  dog  grass
        |   \
       door something

例如,我可以使用Tree.getApple()获取对象.getGrass()。getSomething()在每个getter中我必须检查节点是否存在。问题是我使用的结构非常大,我想要一个实用程序类来加快速度。

我只希望给定对象的名称才能从结构中提取它。例如,有一个方法,在我将Something.class作为参数遍历结构后,返回该对象(如果存在),否则返回null。 (我不能在结构中多次出现一个类,即我只能有一个苹果对象)

这可能吗?我可以用它来实现它吗?

4 个答案:

答案 0 :(得分:3)

实现遍历三者的访问者并在访问者中实现过滤器。

粗略地说:

    public class LeafSearching {

    private final Class typeToFind;

    private Object result;

    public LeafSearching(Class typeToFind) {
        this.typeToFind = typeToFind;
    }

    public void visit(Node node) {
        if (typeToFind.isAssignableFrom(node.getClass())){
            result = node;
            return;
        }

        for (Node child : node.getChildren()) {
            child.accept(this);
        }
    }
}

interface Node {

    boolean hasChildren();

    List<Node> getChildren();

    void accept(LeafSearching ls);
}

class Apple implements Node {
    //...
}

class Cat implements Node {
    // ...
}

class TreeRoot implements Node {

    private Apple apple;

    private Cat cat;

    public Apple getApple() {
        return apple;
    }

    public Cat getCat() {
        return cat;
    }

    @Override
    public boolean hasChildren() {
        return false;
    }

    @Override
    public List<Node> getChildren() {
        final List<Node> children = new ArrayList<Node>;

        if (getApple() != null) {
            children.add(this.apple);
        }

        if (getCat() != null) {
            children.add(this.cat);
        }

        return children;
    }

    public void accept(LeafSearching ls) {
        ls.visit(this);
    }
}

答案 1 :(得分:1)

我认为答案是继承。

为所有类型的节点创建一个名为tree node的类。这将作为一个超级类。 对于所有实际类型,如苹果,草或其他东西,使自己的类扩展treenode类。在遍历方法中,您可以使用instanceof方法检查每个节点的类型以查找所需的节点类型。

答案 2 :(得分:1)

我认为你要做的事情可以通过几种不同的方式实现,如上所述;你可以使用继承,你可以使用visitor pattern(也许如果你使用Eclipse,你可以像Eclipse ASTVisitor的工作方式一样使用它)。

我想说你也可以使用声明getChild(name)这样的方法的接口来检查你要搜索的类的名称并循环遍历树。

在我看来,这里的底线是你必须选择你想要的方式。

答案 3 :(得分:0)

我不确定您是如何遍历该数据的,但instanceof是您在检查特定类时需要的运算符。然后调用适当的方法。