0

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

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

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

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

那可能吗?我可以用什么来实现它?

4

4 回答 4

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);
    }
}
于 2012-12-06T10:13:08.593 回答
1

我认为答案是继承。

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

于 2012-12-06T10:15:40.577 回答
1

如上所述,我认为您正在尝试做的事情可以通过几种不同的方式实现;您可以使用继承,您可以使用访问者模式(也许如果您使用的是 Eclipse,则可以像 Eclipse ASTVisitor 的工作方式一样使用它)。

我想说您还可以使用声明 getChild(name) 之类的方法的接口来检查您正在搜索的类的名称并遍历树。

在我看来,这里的底线是,你只需要选择你想做的方式。

于 2012-12-06T10:30:18.857 回答
0

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

于 2012-12-06T10:14:47.347 回答