0

我正在尝试在 java中实现A* 寻路算法。所以我创建了一个网格,并要求用户提供它的尺寸。问题是当width!=height时,程序会抛出该异常。例如,创建 5x5 的网格没有问题,而 5x7 的网格则没有。我不确定如何修复它。这是代码:

JFrame frame = new JFrame();
String rows =  JOptionPane.showInputDialog(frame,
                "Συμπληρώστε τον αριθμό γραμμών του πλέγματος: \n",
                "Δημιουργία πλέγματος",
                JOptionPane.PLAIN_MESSAGE);
String cols =  JOptionPane.showInputDialog(frame,
                "Συμπληρώστε τον αριθμό στηλών του πλέγματος: \n",
                "Δημιουργία πλέγματος",
                JOptionPane.PLAIN_MESSAGE);
int rowsnum = Integer.parseInt(rows); 
int colsnum = Integer.parseInt(cols);
transient Image buffer; 

GridCell gridCell[][] = new GridCell[rowsnum][colsnum];
public Map()
{
    super();
    //{{INIT_CONTROLS
    setLayout(new GridLayout(rowsnum,colsnum));
    //}}
    for(int i=0;i<rowsnum;i++){
        for(int j=0;j<colsnum;j++){
            System.out.println ("i=" + i + " j="+ j);
           gridCell[j][i] = new GridCell();
           gridCell[j][i].setPosition(new Point(j,i));
           add(gridCell[j][i]);
        }
    }
}

如您所见,我在每个循环中打印 i 和 j 以查看问题出在哪里。结果是(当我尝试创建一个 3x5 网格时):

run:

i=0 j=0
i=0 j=1
i=0 j=2
i=0 j=3
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
    at Map.<init>(Map.java:32)

第 32 行是:

gridCell[j][i] = new GridCell();

如果有人可以帮助我,我将不胜感激!

PS忽略希腊!:-D

4

2 回答 2

0

在这一行上,您创建一个二维数组,rowsnumcolsnum

GridCell gridCell[][] = new GridCell[rowsnum][colsnum];

但是在这里你使用它就好像它是colsnumby rowsnum

for(int i=0;i<rowsnum;i++){
    for(int j=0;j<colsnum;j++){
        System.out.println ("i=" + i + " j="+ j);
       gridCell[j][i] = new GridCell();

i介于 0 和(exclusive) 之间,rowsnum但进入介于 0 和colsnum(exclusive)之间的维度

j介于 0 和colsnum(exclusive) 之间,但进入 0 和rowsnum(exclusive) 之间的维度。

解决方案

要么ij是错误的方式在gridCell[j][i](和其他地方)或rowsnumcolsnum是错误的方式在new GridCell[rowsnum][colsnum]. 它取决于您要实现的目标,尽管通常它通常是 array(rows,columns); 暗示 i 和 j 是错误的方式

于 2013-10-07T10:10:18.370 回答
0

问题在于代码中使用行索引 (i) 和 col injex (j) 的方式。请在下面的代码中交换 i 和 j

       gridCell[j][i] = new GridCell();
       gridCell[j][i].setPosition(new Point(j,i));
       add(gridCell[j][i]);
于 2013-10-07T10:25:25.597 回答