java - Eclipse - Java 数组 ID 值相等。无法独立更改值

标签 java android arrays eclipse

我有两个这样创建的数组:

public int GameBoard[][] = new int[30][14];
public int DirectionMap[][] = new int[30][14];

然后我像这样初始化数组:

for (int i = 0; i < GameBoard.length; i++)
{
    for (int j = 0; j < GameBoard[i].length; j++)
    {
        GameBoard[i][j] = 0;
    }
}

... //Same for DirectionMap

当我运行函数时:

DirectionMap = AStar(GameBoard);

为了渲染我的单位将遵循的寻路 map ,DirectionMap 被正确设置为基于我的 GameBoard 生成的值。但是 GameBoard 也设置为结果。当我在 Eclipse 中以 Debug模式运行应用程序时,我可以看到两个数组的 ID 相同。出于某种原因,它们似乎指向内存空间。我的 AStar 函数根本不修改 GameBoard 数组。对它的唯一引用是 int retVal[][] = GameBoard;

我的函数原型(prototype)是 public int[][] AStar(int[][] Board);并返回 int[][] retVal。

我不知道为什么我不能在没有 GameBoard 跟随的情况下更改 DirectionMap 的值。我以前从未遇到过这样的问题。

非常感谢任何想法。感谢您的帮助。

        public int[][] AStar(int[][] Board)
        {
        int retVal[][] = Board;

        //Initialize All Needed Lists
        int width = retVal.length;
        int height = retVal[0].length;
        int goalX = 0;
        int goalY = 0;
        //List<Node> fieldInfo = new ArrayList<Node>(); 

        Node fieldArray[][] = new Node[width][height];

        for (int i = 0; i < fieldArray.length; i++)
        {
            for (int j = 0; j < fieldArray[i].length; j++)
            {
                fieldArray[i][j] = new Node(i, j);
                if (retVal[i][j] == 2)
                {
                    fieldArray[i][j].setOpen(1);
                    fieldArray[i][j].setDirection(10); //Set as target
                    goalX = i;
                    goalY = j;
                }
                if (retVal[i][j] == 1)
                {
                    fieldArray[i][j].setOpen(0);
                    fieldArray[i][j].setDirection(9); //Set as wall
                }
            }
        }

                    //Add AStar Algorithm Here

        for (int i = 0; i < fieldArray.length; i++)
        {
            for (int j = 0; j < fieldArray[i].length; j++)
            {
                if (fieldArray[i][j].getDirection() == 0)
                {
                    //Occurs when node was never reached
                    int dX = i - goalX;
                    int dY = j - goalY;
                    if (dX < 0)
                        dX = -dX;
                    if (dY < 0)
                        dY = -dY;
                    if (dY > dX)
                        fieldArray[i][j].setDirection(1);
                    else
                    {
                        if (i > goalX)
                            fieldArray[i][j].setDirection(7);
                        if (i < goalX)
                            fieldArray[i][j].setDirection(3);
                    }
                }
            }
        }

        for (int i = 0; i < fieldArray.length; i++)
        {
            for (int j = 0; j < fieldArray[i].length; j++)
            {
                retVal[i][j] = fieldArray[i][j].getDirection();
            }
        }

        return retVal;
    }

最佳答案

请记住,当您将对象传递给方法时,您实际上是在传递引用的副本。因此,当您初始化 retVal[][] = Board; 时,您实际上使用另一个引用 retVal 指向 Board。您将返回对 DirectionMap 的相同引用。因此 BoardDirectionMap 的 ID 相同。考虑 array copy相反。

关于java - Eclipse - Java 数组 ID 值相等。无法独立更改值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9854444/

相关文章:

java - 当 x 接近 0 时,使 z 接近 100

Java 图形未正确更新

java - Spring RequestMapping 冲突

android - autoMirrored 属性在 jetpack compose 中不起作用

android - 如何取消contentresolver applyBatch?

c - 当用户在 c 中完成输入时停止 for 循环

java - 独立 Jython : Import Error (Apache-POI)

javascript - 当涉及键值对时,你可以使用 Javascript Array Map 或 Reduce 吗?

C 数组指针用法说明

java - Android中调用方法时出现奇怪的异常