3

アルゴリズムに少し問題があります。私は何かが欠けていると思いますが、正確には何がわかりません。

文字列を含むツリーまで歩いて、一意の文字列を取得したい。

これは、解析したいツリーのグラフィカルな例です。

木の例

私のツリーには、3 つの異なるタイプの要素があります。

  • ブール演算子 (OR、NOT、AND) => BE
  • その他の演算子 (= など) => QO
  • 葉 (最後の要素) =>LEAF

私はこのようなもので終わりたいと思います:

"LEAF QO LEAF BE LEAF QO LEAF "

今のところ、再帰的な方法を使用します。ツリーの現在の要素を確認し、所有する要素のタイプに応じて、その子に対してメソッドを再実行します。各ステップで、最終的な文字列を入力します。

public class SingleTest { static String[] booleanElements = {"or", "and", "not"};

public static void main(String[] args) throws Exception {
    CommonTree tree = (CommonTree)parser.parse().getTree();

    if(true){
        String where = "";
        printWhere(tree, where);
        System.out.println(where);
    }       

}   

/*
 * Print to where tests
 */
public static boolean isBooleanElement(CommonTree t){
    return Arrays.asList(booleanElements).contains(t.toString().toLowerCase());
}


public static String printWhere(CommonTree t, String where){
    //---------------------
    // Checking node type
    //---------------------

    // Boolean Element 
    if (isBooleanElement(t)){
        // Continue parsing the tree                
        for ( int i = 0; i < t.getChildCount(); i++ ) {
            printWhere((CommonTree)t.getChild(i), where+ "BE");
        }               
    }

    // Last element of tree (LEAF)
    else if(t.getChildCount() == 0 ){
        where = where + "LEAF";
    }

    // query operator
    else{
        // Continue parsing the tree    
        for ( int i = 0; i < t.getChildCount(); i++ ) {
            printWhere((CommonTree)t.getChild(i), where + "QO");
        }                   
    }

    //---------------------
    return where;
}

私の問題は、このコード:

        String where = "";
        System.out.println(printWhere(tree, where));

"" を返します (これは私の実装では論理的です)。

だから私の質問は、最終出力として無効でない文字列を取得するにはどうすればよいですか?

これが十分に明確であることを願っています 助けてくれてありがとう

このクラスはテスト目的でのみ使用されることに注意してください。静的なものをどこにでも配置することは悪い習慣であることを知っています:)

編集 :

問題は(予想どおり)再帰の経験が不足しているためでした。これが私の最終的なコードです:

public static String printWhere(CommonTree t, String where){
    //---------------------
    // Checking node type
    //---------------------

    // Boolean Element 
    if (isBooleanElement(t)){
        // Continue parsing the tree                
        for ( int i = 0; i < t.getChildCount(); i++ ) {
            where = printWhere((CommonTree)t.getChild(i), where) + "BE";
        }               
    }

    // Last element of tree (LEAF)
    else if(t.getChildCount() == 0 ){
        where = where + "LEAF";
    }

    // query operator
    else{
        // Continue parsing the tree    
        for ( int i = 0; i < t.getChildCount(); i++ ) {
            where = printWhere((CommonTree)t.getChild(i), where ) + "QO";
        }                   
    }

    //---------------------
    return where;
}
4

1 に答える 1

3

問題は、メソッドprintWhereが何も返さないことです! 新しい文字列に値を追加していますwhereが、Java はパラメーターを値で渡すため、この新しく作成された文字列は、メソッドを終了すると破棄されます。

このメソッドが文字列を返しwhere、最後に戻るようにします。次に、再帰呼び出しの結果を上のレベルの文字列と連結します。それが再帰の仕組みです。

于 2012-05-21T09:12:07.640 に答える