我有两个我这样创建的数组:
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;
}
答案 0 :(得分:2)
请记住,当您将对象传递给实际传递引用副本的方法时。因此,当您初始化retVal[][] = Board;
时,实际上使用其他引用Board
指向retVal
。并且您将返回DirectionMap
的相同引用。因此Board
和DirectionMap
的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的任何时候,您将一个引用设置为指向与另一个相同的对象。