Eclipse - Java Array ID值相等。无法独立更改值

时间:2012-03-24 18:42:45

标签: 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);

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

我的函数原型是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;
    }

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

  

我可以看到两个数组的ID是相同的。对于一些   他们似乎指向了记忆空间的原因

Java中的int[]数组的默认值为0。

int[] x = new int[2];
System.out.println(x[0]); // prints 0
System.out.println(x[1]); // prints 0

答案 2 :(得分:0)

  

唯一的引用是int retVal [] [] = GameBoard;

Java数组是对象。如果您在设置array = array的任何时候,您将一个引用设置为指向与另一个相同的对象。