2014-12-02 189 views
0

我写了一个程序,用户输入一个二维数组的维数,然后计算机打印出具有这些维数的表格,并用从0到9的随机整数填充它。然后,如果有四个连续的相等整数出现在表中的任何位置,计算机将返回“真”。如果表中没有连续的相等整数,则返回“False”。例如:为什么我会收到“ArrayIndexOutOfBoundsException”错误?

2 5 8 7 1 
3 2 9 4 7 
5 1 2 0 3 
8 0 1 2 7 

在该表中,两个连续出现,对角线上与第一点。它也可以是这样的:

9 5 3 7 0 
2 5 7 3 1 
8 5 0 2 9 
4 5 1 7 5 

在这张表中,五个从第二个点垂直向下出现。

这是我写的代码:

/*MyName*/ 
package fourconsecutivenumbers; 
import java.util.Random; 
import java.util.Scanner; 
public class FourConsecutiveNumbers { 

public static void main(String[] args) { 

    Scanner rowDimension = new Scanner(System.in); 
    System.out.print("Enter the number of rows: "); 
    int firstInput = rowDimension.nextInt(); 

    Scanner columnDimension = new Scanner(System.in); 
    System.out.print("Enter the number of columns: "); 
    int secondInput = columnDimension.nextInt(); 

    int[][] randomTable = new int[firstInput][secondInput]; 
    for (int row = 0; row < firstInput; row++) { 
     for (int column = 0; column < secondInput; column++) { 
      randomTable[row][column] = (int)(Math.random() * 10 + 0); 
      System.out.print(randomTable[row][column] + " "); 
     } 
     System.out.println(); 
    } 
    if(check_horizontal(randomTable) || check_vertical(randomTable) || check_diagonal(randomTable)){ 
    System.out.println("True"); 
    } 
    else { 
    System.out.println("False"); 
    } 
    } 


public static boolean check_vertical(int[][] randomTable) { 

    for (int i = 0; i<randomTable.length-3; i++){ 
     for(int t=0; t<randomTable[0].length-3;t++){ 
     if (randomTable[i][t]==randomTable[i][t+1] && randomTable[i][t+1]==randomTable[i][t+2] && randomTable[i][t+2]==randomTable[i][t+3]){ 
      return true; 
     } 
    } 
} 
return false; 
} 
public static boolean check_horizontal(int[][] randomTable){ 

    for (int i = 0; i<randomTable.length; i++){ 
     for(int t=0; t<randomTable[0].length;t++){ 
     if (randomTable[t][i]==randomTable[t+1][i] && randomTable[t+1][i]==randomTable[t+2][i] && randomTable[t+2][i]==randomTable[t+3][i]){ 
      return true; 
     } 
    } 

} 
return false; 
} 
public static boolean check_diagonal(int[][] randomTable){ 
//check down  
for (int t =0; t<randomTable.length-3; t++){ 
    for(int i=0; i<randomTable[0].length-3;i++){ 
     if (randomTable[i][t]==randomTable[i+1][t+1] && randomTable[i+1][t+1]==randomTable[i+2][t+2] && randomTable[i+2][t+2]==randomTable[i+3][t+3]){ 
      return true; 
     } 

    } 
} 
//check up 
for (int t = 3; t < randomTable.length; t++){ 
for(int i=0; i<randomTable[0].length-3;i++){ 
    if (randomTable[t][i]==randomTable[t-1][i+1] && randomTable[t-1][i+1]==randomTable[t-2][i+2] && randomTable[t-2][i+2]==randomTable[t-3][i+3]){ 
     return true; 
    } 

} 
} 
return false; 
} 
} 

现在的错误出现,每当我把不同的尺寸。就像一个5x10表或10x5表......但如果我要做5x5表或10x10表,它会执行。我得到的是错误...

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 
at fourconsecutivenumbers.FourConsecutiveNumbers.check_horizontal(FourConsecutiveNumbers.java:49) 
at fourconsecutivenumbers.FourConsecutiveNumbers.main(FourConsecutiveNumbers.java:25) 
Java Result: 1 

我的新节目,但我知道错误是从49行也许我写的for循环错了吗?我不知道我做错了什么,我希望有人能告诉我我做错了什么,以及如何解决问题,以便我可以学会不该做的事情。

+0

没你混行和列访问阵列? – realUser404 2014-12-02 21:29:57

+0

尝试自己调试。当你尝试访问一个数组时,会发生'ArrayIndexOutOfBoundsException',并且在你的代码中只发生两次。在此之前打印出一些信息:“row”,“column”,“firstInput”,“secondInput”的值是多少?他们是如何获得这些价值的?尝试自己跟随线索,因为这是学习的关键技能。 – yshavit 2014-12-02 21:29:58

+0

我只是建议在纸上写出你的for循环中t和i的数字和状态。它看起来像是阵列困难的根源。 – CBredlow 2014-12-02 21:32:04

回答

2

在check_horizo​​ntal方法你有你的我和T的后到前

if (randomTable[t][i]==randomTable[t+1][i] && 
    randomTable[t+1][i]==randomTable[t+2][i] && 
    randomTable[t+2][i]==randomTable[t+3][i]){ 
    return true; 
} 

应该

if (randomTable[i][t]==randomTable[i+1][t] && 
    randomTable[i+1][t]==randomTable[i+2][t] && 
    randomTable[i+2][t]==randomTable[i+3][t]){ 
    return true; 
} 

正如在评论中指出你的循环条件也是不正确的:

for (int i = 0; i<randomTable.length; i++){ 
    for(int t=0; t<randomTable[0].length;t++){ 

应该是

for (int i = 0; i<randomTable.length - 3; i++){ 
    for(int t=0; t<randomTable[i].length;t++){ 

这是垂直不是水平检查顾名思义,而是check_vertical实际上是检查水平,这将不是你的程序(只是你标记)产生不利影响。

第一个问题(我和t的混淆)是由于您检查的长度限制为randomTable的长度(即行数),而t仅限于第零个数组的长度t < randomTable[0].length (这是列的数量),但在您的代码中,您将i用作列的索引,t用作行的索引。

这可能是更容易理解,如果你改名我为行和t成列是这样的:

private int getNumberOfRows(int[][] table) { return table.length; } 
private int getNumberOfColumnsInRow(int[][] table, int row) { return table[row].length } 
... 
for (int row = 0; row < getNumberOfRows(randomTable) - 3; row++){ 
    for(int column = 0; column<getNumberOfColumnsInRow(randomTable,i);column++){ 

对于第二点循环条件不正确的,你总计达3至行索引(方括号中的第一个数字),您需要确保在row之后有足够的至少3行。

+0

如果它对您有帮助,我可以给出更长的解释,为什么这是这种情况。 – 2014-12-02 21:32:37

+0

请做。我认为其他方式将是check_vertical。 – NEPat10 2014-12-02 21:35:29

+0

我不确定这会避免'ArrayIndexOutOfBoundsException',因为'i'会增加到'i == randomTable.length'。因此,'i + 3'仍然没有界限。 – Tom 2014-12-02 21:38:44

0

在你换我和T的check_horizo​​ntal。 从您的循环

for (int i = 0; i<randomTable.length; i++){ 
    for(int t=0; t<randomTable[0].length;t++){ 

你需要用

randomTable[i][t] 

,而不是与 randomTable [T] [I]

相关问题