如何递归地构建数组

时间:2013-09-14 20:40:44

标签: java recursion

我想以递归方式构建一个数组,我就这样开始了,不知道如何正确地做到这一点:

public class ConnectivityNode {
  private Server server;
  private ConnectivityNode parent;
  private ArrayList<ConnectivityNode> children;

...

  public Server[] getServerRoute(){
    if(this.parent == null) { return null; }
    return this.server + this.parent.getServerRoute(); //of course this isnt correct
  }
}

想法是获得Server s

的数组

{ parent.parent.server1, parent.server2, server3 }

4 个答案:

答案 0 :(得分:3)

一种选择是使用List并创建辅助函数:

private void getServerRouter(List<Server> l) {
    l.add(server);
    if (parent != null) {
        parent.getServerRouter(l)
    }
}

public Server[] getServerRouter() {
    List<Server> l = new ArrayList<>();
    getServerRouter(l);
    return l.toArray(new Server[l.size()]);
}

您甚至可以考虑从公共方法返回List(这可能更有意义)。

答案 1 :(得分:0)

您需要一个带参数的函数。例如,像这样:

public void getServerRoute(Server actualServer){
  children.add(actualServer);
  if(actualServer.hasParent())
    getServerRoute(actualServer.getParent());
}

由于我不知道你是如何找到服务器的父服务器的,我只是假设你有这个功能。

答案 2 :(得分:0)

使用ArrayList:

有两种方法可以做到这一点。如果返回数组,则可以使用:

public Server[] getServerRoute()
{
    if(this.parent == null) 
    { 
         return null; 
    }

    ArrayList<Server> servers = new ArrayList<Server>();
    servers.add(this.server);
    servers.addAll(Arrays.asList(this.parent.getServerRoute()));

    return servers.toArray(new Server[0]);
}

如果可以返回一个ArrayList(可以简单地将其转换为数组,就像我们上面所做的那样),那么它将使函数更简单:

    public ArrayList<Server> getServerRoute()
    {
        if(this.parent == null) 
        { 
             return null; 
        }

        ArrayList<Server> servers = new ArrayList<Server>();
        servers.add(this.server);
        servers.addAll(this.parent.getServerRoute());

        return servers;
    }

答案 3 :(得分:0)

如果我理解正确,并且你想获得树中从当前元素到根元素的路由,它将是这样的:

public Server[] getServerRoute(){
    List<Server> servers=new ArrayList<>();
    walk(this,servers);
    return servers.toArray(new Server[servers.size()]);
  }

private static void walk(ConnectivityNode node,List<Server> servers)
{
servers.add(node.getServer());
if (node.getParent() != null)
{
walk(node.getParent(),servers);
}

}