0

たとえば、さまざまなタイプのオブジェクトで構成されるツリーがあります

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

たとえば、Tree.getApple().getGrass().getSomething() を使用してオブジェクトにアクセスできます。getSomething() では、getter ごとにノードが存在するかどうかを確認する必要があります。問題は、私が使用する構造がかなり大きく、これを高速化するためのユーティリティ クラスが必要なことです。

オブジェクトの名前だけを指定して、構造から抽出できるようにしたい。たとえば、Something.class を引数として渡して構造をトラバースするメソッドを作成するには、オブジェクトが存在する場合はそれを返し、それ以外の場合は null を返します。(構造内で 1 つのクラスを複数回使用することはできません。つまり、apple オブジェクトを 1 つしか使用できません)

それは可能ですか?それを実装するために何を使用できますか?

4

4 に答える 4

3

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

答えは継承だと思います。

すべての種類のノードに対してツリー ノードというクラスを作成します。これはスーパークラスとして機能します。リンゴ、草などのすべての実際のタイプに対して、treenode クラスを拡張する独自のクラスを作成します。トラバーサル メソッドでは、各ノードのタイプをチェックして、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 に答える