Check if number exist in a row and a column in a Bidimensional Array Java

Viewed 58

I'm trying to make a program that generates ramdom sudokus. The program verifies that a number is not repeated in the row and in the column,

verifyExistNumberInRow --> works perfect

But when call to verifyExistNumberInColumn --> infinite loop

Why, I dont found the solution, is an index problem? or a value problem?.

Thank you.

/**
 * Generate a random Sudoku
 */

private static void generateRandomSudoku() {

    Integer[][] array = new Integer[9][9];
    Integer number;

    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[i].length; j++) {

            do {
                number = (int) (Math.random() * 9) + 1;

            } while (verifyExistNumberInRow(number, array[i]) || verifyExistNumberInColumn(j, number, array));

            array[i][j] = number;
        }
    }

    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[i].length; j++) {
            System.out.print(array[i][j] + " ");
        }
        System.out.print("\n");
    }
}

/**
 * Check if a number exist in array file.
 *
 * @param number
 * @param array
 * @return True if exist, other false.
 */
private static boolean verifyExistNumberInRow(Integer number, Integer[] array) {

    return Stream.of(array)
            .filter(Objects::nonNull)
            .anyMatch(element -> element.equals(number));
}

/**
 * Check if a number exist in array column
 *
 * @param position column number
 * @param number   number to find in column
 * @param array
 * @return true if exist, other false
 */
private static boolean verifyExistNumberInColumn(Integer position, Integer number, Integer[][] array) {

    for (int i = 0; i < array.length; i++) {
        if (array[i][position] != null) {

            if (array[i][position].equals(number)) {
                return true;
            }
        }
    }
    return false;
}
2 Answers

Try reverse the location of 'position' and 'i' and add "i < array[position].length":

private static boolean verifyExistNumberInColumn(Integer position, Integer number, Integer[][] array) {

for (int i = 0; i < array[position].length; i++) {
    if (array[position][i] != null) {

        if (array[position][i].equals(number)) {
            return true;
        }
    }
}
return false;
}

The solution that i find is deleted the row when number is found in column. And works it.

 private static void generateRandomSudoku() {

    Integer[][] array = new Integer[9][9];
    Integer number;

    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[i].length; j++) {

            boolean found = true;

            while (found) {

                number = (int) (Math.random() * 9) + 1;

                if (!verifyExistNumberInRow(number, array[i])) {
                    if (!verifyExistNumberInColumn(j, number, array)) {
                        array[i][j] = number;
                        found = false;
                    } else {
                        array = deleteRow(i, array);
                        j = 0;
                    }
                }
            }
        }

    }

    printSudoku(array);
}

/**
 * Delete (set to null) values for a row from bidimensional array
 * 
 * @param row row number to delete
 * @param array
 * @return 
 */
private static Integer[][] deleteRow(int row, Integer[][] array) {

    for (int i = 0; i < array.length; i++) {
        array[row][i] = null;
    }
    return array;
}


/**
 * Check if a number exist in array file.
 *
 * @param number
 * @param array
 * @return True if exist, other false.
 */
private static boolean verifyExistNumberInRow(Integer number, Integer[] array) {

    return Stream.of(array)
            .filter(Objects::nonNull)
            .anyMatch(element -> element.equals(number));
}

/**
 * Check if a number exist in array column
 *
 * @param position column number
 * @param number   number to find in column
 * @param array
 * @return true if exist, other false
 */
private static boolean verifyExistNumberInColumn(Integer position, Integer number, Integer[][] array) {

    for (int i = 0; i < array[position].length; i++) {
        if (array[i][position] != null) {

            if (array[i][position].equals(number)) {
                return true;
            }
        }
    }
    return false;
}
Related