[英]Java - Return a list with recursion
我需要在特定節點之后返回所有子項的列表。 這是我所做的-
public List<Object> getChildrenTree(Object currentObject, List<Object> returnList){
//get all child-URIs for the category
List<Object> objectChildren = currentObject.getChildren();
for (Obj childObj : objectChildren) {
if(childObj !=null){
if(childObj.getChildren().size() >0){
getChildrenTree(childObj,returnList);
}else{
returnList.add(childObj);
}
}
}
return returnList;
}
但它不起作用,並且不能正確添加所有子項。
您沒有添加有孩子的孩子。
您需要將循環更改為:
for (Obj childObj : objectChildren) {
if(childObj !=null){
returnList.add(childObj);
if(childObj.getChildren().size() >0){
getChildrenTree(childObj,returnList);
}
}
}
return returnList;
即,您應該始終添加childObj
,無論它是否具有子級。
我還將childObj
的添加項childObj
添加其子項之前,假設這是您希望節點出現的順序(即,首先是父項,然后是子項)。
此外,如前所述,循環內不應有return語句,因為它將跳過除第一個孩子以外的所有對象。 return語句應在循環之后。
如果您的方法已經在返回列表,則不需要一個包含返回對象的額外列表。 您仍然想要然后可以使用它。 否則,下面的代碼會針對您的if
更改。
public List<Object> getChildrenTree(Object currentObject){
//get all child-URIs for the category
List<Object> returnList=new ArrayList<Object>();
List<Object> objectChildren = currentObject.getChildren();
for (Object childObj : objectChildren) {
if(childObj !=null){
// add current child
returnList.add(childObj);
if(!childObj.getChildren().isEmpty()){
// invoke recursive to extract childs of current object and add them to list.
//That's all childs you need
returnList.addAll(getChildrenTree(childObj));
}
}
}
return returnList;
}
您只需要添加當前非空子級,然后為所有子級調用相同的方法來提取其子級並將addAll添加到同一列表中
您不添加頭節點:
public List<Object> getChildrenTree(Object currentObject, List<Object> returnList){
returnList.add(currentObject);
//get all child-URIs for the category
List<Object> objectChildren = currentObject.getChildren();
for (Obj childObj : objectChildren) {
if(childObj !=null){
if(childObj.getChildren().size() >0){
return getChildrenTree(childObj,returnList);
}
}
}
return returnList;
}
給出的答案沒有錯,但是我想我會稍作改動。 如果可能,我寧願避免循環內的條件,您可以對代碼進行一些稍微的重新排列。 在下面的示例中,我同時展示了Java 8 lambda版本和Java 8之前的版本。在這種情況下,Java 8代碼並不能真正為您帶來任何好處,但是我還是把它扔了在那里。
我創建了一個自定義Node類以查看輸出
public class ListAdd {
public static void main(String[] args) {
Node node = new Node(0);
addChildren(3,node);
addChildren(4,node.getChildren().get(0));
addChildren(2,node.getChildren().get(2));
addChildren(1,node.getChildren().get(2).getChildren().get(0));
addChildren(2,node.getChildren().get(2).getChildren().get(0).getChildren().get(0));
List<Node> allNodes = getAllNodes(node,new ArrayList<>());
System.out.println("------------------------\nTotal number of nodes: " + allNodes.size());
allNodes.forEach(System.out::println);
allNodes = getAllNodesOld(node, new ArrayList<>());
System.out.println("------------------------\nTotal number of nodes: " + allNodes.size());
allNodes.forEach(System.out::println);
}
public static List<Node> getAllNodes(Node parent, List<Node> allNodes){
if(parent == null || parent.getChildren().size() < 1){
return allNodes;
}
parent.getChildren()
.forEach(node -> {
allNodes.add(node);
getAllNodes(node,allNodes);
});
return allNodes;
}
public static List<Node> getAllNodesOld(Node parent, List<Node> allNodes){
if(parent == null || parent.getChildren().size() < 1){
return allNodes;
}
for(Node node : parent.getChildren()){
allNodes.add(node);
getAllNodesOld(node, allNodes);
}
return allNodes;
}
public static void addChildren(int amount, Node parent){
for(int i=0;i<amount;i++){
parent.addChild(new Node(i + (parent.getVal() + 1)));
}
}
public static class Node{
List<Node> children = new ArrayList<>();
int val;
public Node(int v){
val = v;
}
public void addChild(Node node){
children.add(node);
}
public List<Node> getChildren(){
return children;
}
public int hashCode(){
return 31 * val * (children.size() + 1);
}
public int getVal(){
return val;
}
public boolean equals(Object o){
if(o == this) return true;
if(!(o instanceof Node)) return false;
Node n = (Node)o;
return val == n.val && children.containsAll(n.children);
}
public String toString(){
return "Node{val="+val+",children="+children+"}";
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.