尝试填充3D链接列表时出现堆栈溢出。我不明白为什么它不止于指定范围,而是永远运行。这可能是一个简单的错误,我只是不明白。

编辑:好的,我现在已经更新了代码并消除了这个愚蠢的错误,但是它仍然无法完全按照预期的方式运行。它似乎确实会生成10x10x10列表,但是它会无限运行。用(10,10,10)初始化,它应该创建10000个对象并停止。我只是试图创建一个表示3d坐标平面的列表,每个整数坐标是一个节点,可通过方向指针北,南,东,西,上或下访问。

任何帮助表示赞赏

public class Main {


    public static void main(String[] args) {
        NodeController3D con = new NodeController3D(6,6, 6);

    }

}
public class Node3D {

//    public Node3D(Node3D... nodes) {
//        if (nodes.length != 5) {
//            throw new RuntimeException();
//        }
//        this.nodes = nodes;
//    }

    public Node3D[] nodes;
    public int x, y, z;


    public Node3D north() {
        return nodes[0];
    }

    public Node3D south() {
        return nodes[1];
    }

    public Node3D east() {
        return nodes[2];
    }

    public Node3D west() {
        return nodes[3];
    }

    public Node3D up() {
        return nodes[4];
    }

    public Node3D down() {
        return nodes[5];
    }
}

public class NodeController3D {

    public NodeController3D(int length, int width, int height) {
        HEAD = new Node3D();
        pnc(HEAD, length, width, height);
    }

    private void pnc(Node3D node, int xMax, int yMax, int zMax) {
        if(node.nodes == null) {
            node.nodes = new Node3D[5];
        }

        if (node.x < xMax) {
            Node3D newNode = node.nodes[2] = new Node3D();
            newNode.x = node.x + 1;
            newNode.y = node.y;
            newNode.z = node.z;
            System.out.println(newNode.x + ", " + newNode.y + ", " + newNode.z);

            pnc(newNode, xMax, yMax, zMax);
        }
        if (node.y < yMax) {
            Node3D newNode = node.nodes[0] = new Node3D();
            newNode.x = node.x;
            newNode.y = node.y + 1;
            newNode.z = node.z;

            pnc(newNode, xMax, yMax, zMax);
        }
        if (node.z < zMax) {
            Node3D newNode = node.nodes[4] = new Node3D();
            newNode.x = node.x;
            newNode.y = node.y;
            newNode.z = node.z + 1;

            pnc(newNode, xMax, yMax, zMax);
        }
    }

//    public NodeController3D(int radius) {
//
//    }

    public final Node3D HEAD;
}


编辑:好的,我现在已经更新了代码并消除了这个愚蠢的错误,但是它仍然无法完全按照预期的方式运行。它似乎确实会生成10x10x10列表,但是它会无限运行。用(10,10,10)初始化,它应该创建10000个对象并停止。我只是试图创建一个表示3d坐标平面的列表,每个整数坐标是一个节点,可通过方向指针访问。

最佳答案

您正在遇到无限递归。

那么发生了什么。

您正在创建一个新的Array

if(node.nodes == null) {
   node.nodes = new Node3D[5];
}


继续使用Node3D作为newNode变量。发生这种情况是因为node.x<xMax为true。 -> Node3D newNode = node.nodes[2] = new Node3D();

您现在使用此pnc递归调用newNode

所以现在发生了什么,node.y<yMax将是true。
现在,您重新分配newNode。 Node3D newNode = node.nodes[0] = new Node3D();
并再次递归调用pnc。但是您现在遇到了问题。由于它是新的Node3D,因此node.x<xMax将再次为true,并且这两个步骤将再次发生并进行初始化,直到遇到上述错误为止。

要解决此错误,您可能需要将node.xnode.y复制到新创建的变量中。

通过更改分配,您可以跳出无限递归。

if (node.x < xMax) {
    if (node.nodes[2] == null) {
        node.nodes[2] = new Node3D();
    }
    Node3D newNode = node.nodes[2];
    newNode.x = node.x + 1;
    newNode.y = node.y;
    newNode.z = node.z;

    pnc(newNode, xMax, yMax, zMax);
}
if (node.y < yMax) {
    if (node.nodes[0] == null) {
        node.nodes[0] = new Node3D();
    }
    Node3D newNode = node.nodes[0];
    newNode.x = node.x;
    newNode.y = node.y + 1;
    newNode.z = node.z;

    pnc(newNode, xMax, yMax, zMax);
}
if (node.z < zMax) {
    if (node.nodes[4] == null) {
        node.nodes[4] = new Node3D();
    }
    Node3D newNode = node.nodes[4];
    newNode.x = node.x;
    newNode.y = node.y;
    newNode.z = node.z + 1;

    pnc(newNode, xMax, yMax, zMax);
}


但是,由于我不知道您要在数组的这些特定索引处尝试使用该特定元素来实现什么,因此这可能对您来说是错误的解决方案。

09-13 11:22