Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何递归地构建数组_Java_Recursion - Fatal编程技术网

Java 如何递归地构建数组

Java 如何递归地构建数组,java,recursion,Java,Recursion,我想以递归的方式构建一个数组。我是以这种方式开始的,不知道如何正确地构建数组: public class ConnectivityNode { private Server server; private ConnectivityNode parent; private ArrayList<ConnectivityNode> children; ... public Server[] getServerRoute(){ if(this.parent ==

我想以递归的方式构建一个数组。我是以这种方式开始的,不知道如何正确地构建数组:

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
  }
}
公共类连接节点{
专用服务器;
私有连接节点父节点;
私人ArrayList儿童;
...
公共服务器[]getServerRoute(){
如果(this.parent==null){return null;}
返回this.server+this.parent.getServerRoute();//这当然不正确
}
}
其思想是获得一个
服务器
的数组


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

您需要一个带参数的函数。例如:

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

由于我不知道如何找到服务器的父级,我只是假设您有一个函数来解决这个问题。

您将需要一个带参数的函数。例如:

public void getServerRoute(Server actualServer){
  children.add(actualServer);
  if(actualServer.hasParent())
    getServerRoute(actualServer.getParent());
}
由于我不知道您如何找到服务器的父级,我只是假设您具有这方面的功能。

使用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]);
}
公共服务器[]getServerRoute()
{
if(this.parent==null)
{ 
返回null;
}
ArrayList服务器=新的ArrayList();
添加(this.server);
servers.addAll(Arrays.asList(this.parent.getServerRoute());
返回servers.toArray(新服务器[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;
    }
public ArrayList getServerRoute()
{
if(this.parent==null)
{ 
返回null;
}
ArrayList服务器=新的ArrayList();
添加(this.server);
servers.addAll(this.parent.getServerRoute());
返回服务器;
}
使用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]);
}
公共服务器[]getServerRoute()
{
if(this.parent==null)
{ 
返回null;
}
ArrayList服务器=新的ArrayList();
添加(this.server);
servers.addAll(Arrays.asList(this.parent.getServerRoute());
返回servers.toArray(新服务器[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;
    }
public ArrayList getServerRoute()
{
if(this.parent==null)
{ 
返回null;
}
ArrayList服务器=新的ArrayList();
添加(this.server);
servers.addAll(this.parent.getServerRoute());
返回服务器;
}

一个选项是使用
列表
并创建助手函数:

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()]);
}
private void getServerRouter(列表l){
l、 添加(服务器);
如果(父项!=null){
parent.getServerRouter(l)
}
}
公共服务器[]getServerRouter(){
列表l=新的ArrayList();
getServerRouter(l);
返回l.toArray(新服务器[l.size()]);
}

您甚至可以考虑从public方法返回<代码>列表/代码>(这可能会更有意义).< /p>

一个选项是使用<代码>列表< /> >并创建帮助函数:

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()]);
}
private void getServerRouter(列表l){
l、 添加(服务器);
如果(父项!=null){
parent.getServerRouter(l)
}
}
公共服务器[]getServerRouter(){
列表l=新的ArrayList();
getServerRouter(l);
返回l.toArray(新服务器[l.size()]);
}

你甚至可以考虑从公共方法中返回<代码>列表>代码(这可能会更有意义).< /p> 如果我了解你的正确性,并且你想从你的树中获取当前元素到根元素的路由,它会是这样的:

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

}
公共服务器[]getServerRoute(){
列表服务器=新的ArrayList();
步行(这个,服务器);
返回servers.toArray(新服务器[servers.size()]);
}
私有静态void walk(ConnectivityNode节点,列表服务器)
{
添加(node.getServer());
if(node.getParent()!=null)
{
walk(node.getParent(),服务器);
}
}

如果我正确理解您的意思,并且您希望在树中获取从当前元素到根元素的路由,它将如下所示:

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

}
公共服务器[]getServerRoute(){
列表服务器=新的ArrayList();
步行(这个,服务器);
返回servers.toArray(新服务器[servers.size()]);
}
私有静态void walk(ConnectivityNode节点,列表服务器)
{
添加(node.getServer());
if(node.getParent()!=null)
{
walk(node.getParent(),服务器);
}
}

谢谢,如果我首先需要根目录,我会将其更改为
l.add(0,服务器)对吗?@nir如果你想要的话,我会用<代码>l。添加(0,服务器)
将是不必要的O(n)操作。或者,如果您坚持返回数组,您可以通过反向迭代手动创建数组对吗?@nir如果你想要的话,我会用<代码>l。添加(0,服务器)将是不必要的O(n)操作。或者,如果您坚持返回一个数组,可以通过反向迭代手动创建数组。