的ArrayIndexOutOfBounds。 Java螺旋程序

时间:2013-04-04 21:41:39

标签: java arrays loops 2d spiral

我一直在第21行得到错误ArrayIndexOutOfBounds:4。该行是Spiral [VIndx] [HIndx] =数字。当给定一定维度时,该程序应该创建数字螺旋。例如,如果给定尺寸3,则使用螺旋数字的3x3 2d数组。这是螺旋应该是什么:

7 8 9

6 1 2

5 4 3

为什么我的循环不起作用?

   import java.util.*;import java.io.*;
   public class Spiral{

   public static void Spiral(int dimensions, int [][] Spiral)
   {
   int endNumber = (int)Math.pow(dimensions, 2);
   int number = 1;

   int rightmovement = 1;
   int downmovement = 1;
   int leftmovement = 2;
   int upmovement = 2;

   int HIndx = (dimensions-1)/2;
   int VIndx = (dimensions-1)/2;

   while(number<=endNumber)
   {
for(int i = 0;i<=rightmovement;i++)
{
   Spiral[VIndx][HIndx]=number;
   number++;
   HIndx++;
   if(number==endNumber)break;
}
rightmovement++;


for(int i = 0;i<=downmovement;i++)
{
Spiral[VIndx][HIndx]=number;
number++;   
VIndx++;
if(number==endNumber)break;
}
downmovement++;


for(int i = 1;i<=leftmovement;i++)
{
 Spiral[VIndx][HIndx]=number;
number++;   
HIndx--;
if(number==endNumber)break;
}
leftmovement++;


for(int i = 1;i<=upmovement;i++)
{
 Spiral[VIndx][HIndx]=number;
number++;   
VIndx--;
if(number==endNumber)break;
}
upmovement++;

 }

 }
 public static void main(String[]args)throws IOException
 {
 File file = new File("spiral.txt");
 Scanner input = new Scanner(file);
 String [] numbers = new String [2];
 int i =0;
 while (input.hasNextLine())
 {
 String line = input.nextLine();
 numbers[i]=line;
 i++;
 }
 int dimensions = 0;
 input.close();
 int [][] Spiral = new int [dimensions][dimensions];  

 dimensions = Integer.parseInt(numbers[0]);
 int range = Integer.parseInt(numbers[1]);
  if(dimensions%2==0)
  {
    dimensions+=1;
  }

 Spiral(dimensions, Spiral);

 for(i = 0; i<dimensions;i++){
   for(int j = 0; j<dimensions;j++){ 
   System.out.println(Spiral[i][j]);
                       }
        }

     }
           }

1 个答案:

答案 0 :(得分:0)

首先,您的循环条件应使用<而不是<=

其次,如果你考虑螺旋,你会发现你总是以正确的运动结束。你第一次点击break

if(number==endNumber)break;

但这并没有让你退出while循环 - 这只会离开for循环。那么你进入向下移动for循环并获得索引超出范围的异常。

第三,您需要先在循环前输入中心号码。

此外,rightmovementleftmovement,......每次都应增加2。在更大的网格中更容易看到这个原因。

21 22 23 24 25
20  7  8  9 10
19  6  1  2 11
18  5  4  3 12
17 16 15 14 13

注意第一个右移动写2,然后下一个写8 9 10,最后一个写22 23 24 25,如果你要继续写26

要解决break未离开while循环的问题,只需将其更改为return语句即可。