我有一个由不同类型的对象组成的树,例如
Tree
| \
apple cat
| \
dog grass
| \
door something
例如,我可以使用Tree.getApple()获取对象.getGrass()。getSomething()在每个getter中我必须检查节点是否存在。问题是我使用的结构非常大,我想要一个实用程序类来加快速度。
我只希望给定对象的名称才能从结构中提取它。例如,有一个方法,在我将Something.class作为参数遍历结构后,返回该对象(如果存在),否则返回null。 (我不能在结构中多次出现一个类,即我只能有一个苹果对象)
这可能吗?我可以用它来实现它吗?
答案 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
是您在检查特定类时需要的运算符。然后调用适当的方法。