Что я делаю неправильно? (Java.lang.ArrayIndexOutOfBoundsException)
Мой код должен найти четыре последовательных числа одного и того же значения, удовлетворяющие этим четырем сценариям: (исходный код прикреплен внизу)
fig.a (соответствует методу isConsecutiveFourinStacks)
0 1 0 3 1 6 1
0 1 6 8 6 0 1
5 6 2 1 8 2 9
6 5 6 1 1 9 1
1 3 6 1 4 0 7
3 3 3 3 4 0 7
fig.b (соответствует методу isConsecutiveFourinColumns)
0 1 0 3 1 6 1
0 1 6 8 6 0 1
5 5 2 1 8 2 9
6 5 6 1 1 9 1
1 5 6 1 4 0 7
3 5 3 3 4 0 7
fig.c (соответствует методу isConsecutiveFourinReverseDiagonal)
0 1 0 3 1 6 1
0 1 6 8 6 0 1
5 6 2 1 6 2 9
6 5 6 6 1 9 1
1 3 6 1 4 0 7
3 6 3 3 4 0 7
fig.d (соответствует методу isConsecutiveFourinDiagonal)
0 1 0 3 1 6 1
0 1 6 8 6 0 1
9 6 2 1 8 2 9
6 9 6 1 1 9 1
1 3 9 1 4 0 7
3 3 3 9 4 0 7
Пока что я смог сделать как положено, кроме рис.с
Я знаю, что могу просто перевернуть массив, чтобы он вел себя как fig.d, и использовать существующий метод для fig.d, чтобы получить необходимый результат.
В данном конкретном случае я пытаюсь прочитать данные из массива снизу вверх и слева направо, что приведет к рисунку, подобному рис.
Но я продолжаю выходить из связанной ошибки (строка 128).
Целью решения этой проблемы является:
1. Понимать индексирование многомерных массивов.
2. Понять, как вложенные циклы взаимодействуют друг с другом.
Я всего лишь студент, изучающий бакалавры в области компьютерных наук, с предварительными знаниями в C и C++, но никогда не получал четкого понимания этих двух аспектов кодирования. Любые советы будут с благодарностью.
package patternRecognition;
import java.util.Scanner;
public class ConsecutiveFoursInMatrix
{
public static Scanner input = new Scanner(System.in);
public static void main(String[] args)
{
int rows,columns;
System.out.println("Enter number of elements in a rows: ");
rows = input.nextInt();
System.out.println("Enter number of columns: ");
columns = input.nextInt();
int[][] matrix = new int[columns][rows];
System.out.println("Start entering "+rows+" number of elements in "+columns+" stack(s): ");
for(int i=0; i<=columns-1; i++)
{
for(int j=0; j<=rows-1; j++)
{
matrix[i][j]=input.nextInt();
}
}
System.out.println("The matrix you entered: ");
for(int i=0; i<=columns-1; i++)
{
for(int j=0; j<=rows-1; j++)
{
System.out.print(matrix[i][j]+" ");
}
System.out.println();
}
//if(isConsecutiveFourinStacks(matrix,rows,columns)||isConsecutiveFourinColumns(matrix,rows,columns)||isConsecutiveFourinDiagonal(matrix,rows,columns))
if(isConsecutiveFourinReverseDiagonal(matrix,rows,columns))
{
System.out.println("Series has consecutive fours");
}
else System.out.println("Series does not have consecutive fours");
}
public static boolean isConsecutiveFourinStacks(int[][] matrix, int rows, int columns)
{
int count = 0;
int consecutives = 0;
for(int i=0; i<=columns-1; i++)
{
for(int j=0; j<=rows-2; j++)//rows-2 to avoid array out of bound error
{
if(matrix[i][j]==matrix[i][j+1])
{
count++;
if (count==3)
{
consecutives++;
count = 0;
}
}
else count = 0;
}
}
if(consecutives>0) return true;
else return false;
}
public static boolean isConsecutiveFourinColumns(int[][] matrix, int rows, int columns)
{
int count = 0;
int consecutives = 0;
for(int j=0; j<=rows-1; j++)
{
for(int i=0; i<=columns-2; i++)
{
if(matrix[i][j]==matrix[i+1][j])
{
count++;
if(count==3)
{
consecutives++;
count = 0;
}
}
else count = 0;
}
}
if (consecutives>0) return true;
else return false;
}
public static boolean isConsecutiveFourinDiagonal(int[][] matrix, int rows, int columns)
{
int count = 0;
int consecutives = 0;
for(int column=0; columns-column>=4; column++)
{
for(int row=0; rows-row>=4; row++)
{
for(int i=column,j=row; columns-i>=2 && rows-j>=2; i++,j++)
{
if(matrix[i][j]==matrix[i+1][j+1])
{
count++;
if(count==3)
{
consecutives++;
count=0;
}
}
else count=0;
}
}
}
if (consecutives>0) return true;
else return false;
}
public static boolean isConsecutiveFourinReverseDiagonal(int[][] matrix, int rows, int columns)
{
int count = 0;
int consecutives = 0;
for(int column=columns-1; column>=0; column--)
{
for(int row=0; row<=rows-1; row++)
{
for(int i=column,j=row; columns-i>=2 && j<=rows-2; i--,j++)
{
if(matrix[i][j]==matrix[i-1][j+1])
{
count++;
if(count==3)
{
consecutives++;
count=0;
}
}
else count=0;
}
}
}
if (consecutives>0) return true;
else return false;
}
}
[1]: https://stackru.com/images/9f5b37f42a54cdc0b7cb380b33079c56a3331be3.png
1 ответ
В самом внутреннем цикле метода isConsecutiveFourinReverseDiagonal просто установите значение i больше 0, поместите i>0
проверьте шаг проверки самого внутреннего цикла:
for(int i=column,j=row; columns-i>=2 && j<=rows-2 && i>0; i--,j++){
if(matrix[i][j]==matrix[i-1][j+1]){
count++;
if(count==3){
consecutives++;
count=0;
}
}
else count=0;
}