我想以递归方式构建一个数组,我就这样开始了,不知道如何正确地做到这一点:
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 }
答案 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);
}
}