我有一个轻微的算法问题。我想我错过了什么但却无法弄清楚是什么。
我想走到一个包含字符串的树上,然后拿出一个独特的字符串。
以下是我要解析的树的图形示例。
我的树有三种不同类型的元素:
我想结束这样的事情:
"LEAF QO LEAF BE LEAF QO LEAF "
现在,我使用递归方法:检查树的当前元素,然后根据我拥有的元素类型对其子元素重新运行该方法。对于每个步骤,我将填充我的最后一个字符串。
public class SingleTest { static String [] booleanElements = {“或”,“和”,“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;
}
答案 0 :(得分:3)
问题是你的方法printWhere
没有返回任何东西!您将值附加到新的where
字符串,但由于Java按值传递参数,因此当您离开方法时,这个新创建的字符串将被丢弃。
使此方法返回字符串并在其末尾返回where
。然后,将递归调用的结果与上一级别的字符串连接起来。这就是递归的工作原理。