アルゴリズムに少し問題があります。私は何かが欠けていると思いますが、正確には何がわかりません。
文字列を含むツリーまで歩いて、一意の文字列を取得したい。
これは、解析したいツリーのグラフィカルな例です。
私のツリーには、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;
}