Java recursion does not iterate over all top-level elements
I face the problem of recursion I have an object that contains its own list. Each object in the list can save its own list This object represents a tree
Now I want to iterate over all possible objects to find a specific object, but I failed At present, my method does not return to the top level. I don't know how to solve it
method:
private Object selectSpecificItem(TreeObject treeObject) {
for (TreeObject to : treeObject.getChildren()) {
Object data = to.getData();
if (data instanceof PaymentOffice) {
PaymentOffice po = (PaymentOffice) data;
if (po.getCode().equals(getModelObject().getLocation())) {
return to;
}
} else if (to.getChildren().length > 0) {
selectSpecificItem(to);
}
}
return null;
}
Assume the following list structure:
Item1
- Item1.1
- Item1.2
- Item1.3
- Item1.4
Item2
Item3
Now it iterates over all 1 / 1 X instead of 2 / 3 The item I need to find now is Item3
How do I change recursion to iterate over all elements?
Solution
You ignored the value returned by the recursive call You should check whether the recursive call returns a non null value, and if so, return it
private Object selectSpecificItem(TreeObject treeObject) {
Object result = null;
for (TreeObject to : treeObject.getChildren()) {
Object data = to.getData();
if (data instanceof PaymentOffice) {
PaymentOffice po = (PaymentOffice) data;
if (po.getCode().equals(getModelObject().getLocation())) {
return to;
}
} else if (to.getChildren().length > 0) {
result = selectSpecificItem(to);
if (result != null) {
return result;
}
}
}
return result;
}
Some people prefer to use a single return statement at the end of a method If you are such a person, you can write:
private Object selectSpecificItem(TreeObject treeObject) {
Object result = null;
for (TreeObject to : treeObject.getChildren()) {
Object data = to.getData();
if (data instanceof PaymentOffice) {
PaymentOffice po = (PaymentOffice) data;
if (po.getCode().equals(getModelObject().getLocation())) {
result = to;
break;
}
} else if (to.getChildren().length > 0) {
result = selectSpecificItem(to);
if (result != null) {
break;
}
}
}
return result;
}
