2013-04-04 37 views
-3

我不斷收到第21行的錯誤ArrayIndexOutOfBounds:4。該行是Spiral [VIndx] [HIndx] = number。該程序應該在給定某個維度時創建一個數字螺旋。例如,如果給定維度3,則爲一個3x3 2d數組,螺旋數字。這裏的螺旋應該是什麼:ArrayIndexOutOfBounds。 Java螺旋程序

爲什麼不是我的工作循環?

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]); 
         } 
     } 

    } 
      } 
+0

你命名的慣例不斷讓我困惑! – Smit 2013-04-04 21:43:57

+0

您是否嘗試過使用調試器? – Vitaly 2013-04-04 21:45:18

回答

0

首先,你的循環條件應該使用<而非<=。第二,如果你考慮螺旋,你會意識到你總是以正確的運動結束。你打的break在你第一次

if(number==endNumber)break; 

但這並不退出你走出while循環 - 這僅留下for循環。那麼你進入下降運動for循環,並獲得索引超出界限的例外。

第三,您需要先輸入循環前的中心號碼。

此外,rightmovement,leftmovement,...應該每次都增加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語句。