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)操作。或者,如果您坚持返回一个数组,可以通过反向迭代手动创建数组。