0

我想递归地构建一个数组我以这种方式开始并且无法弄清楚如何正确地做到这一点:

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
  }
}

这个想法是得到一个Servers的数组

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

4

4 回答 4

3

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

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从公共方法返回(这可能更有意义)。

于 2013-09-14T20:48:45.270 回答
0

您将需要一个带有参数的函数。所以例如像这样:

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

因为我不知道你是如何找到服务器的父级的,所以我只是假设你有一个功能。

于 2013-09-14T20:47:47.320 回答
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;
    }
于 2013-09-14T20:48:18.733 回答
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);
}

}
于 2013-09-14T21:04:31.273 回答