Проверить наличие элементов в каждой строке и столбце 2D-массива - java

Я написал короткую программу, которая случайным образом заполняет 2D-массив размером 10x10 с 0 и 1 сек. Я хочу проверить массив, чтобы увидеть, содержит ли каждая строка и столбец более пяти единиц.

Я сделал это, используя 2 отдельных вложенных цикла for-loops, но есть ли способ проверить каждую строку и столбец, используя только 1 вложенный цикл for и распечатать результат для каждой строки / столбца? Я не могу разработать способ комбинирования того, что у меня есть, в один вложенный цикл. Большое спасибо за любые предложения :)

Вот мой код:

public class Main {

public static void main(String[] args) {

    int[][] array = new int[10][10];
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array.length; j++) {
            array[i][j] = (int) (2 * Math.random());
        }
    }
    System.out.print("---THE MATRIX---
");
    System.out.println();
    for (int[] arr : array) {
        for (int value : arr) {
            System.out.print(value + " ");
        }
        System.out.println();
    }
    System.out.println();
    fiveOnes(array);
}


private static void fiveOnes(int[][] array) {
    System.out.println("---MORE THAN FIVE ONES THROUGHOUT THE MATRIX---
");

    for (int i = 0; i < array.length; i++) {
        int oneCount = 0;
        boolean flag = false;
        for (int j = 0; j < array.length; j++) {
            if (array[i][j] == 1) {
                oneCount++;
            }
        }
        if (oneCount > 5)
            flag = true;
        System.out.println("Row " + (i + 1) + ": " + flag);
    }
    System.out.println();

    for (int i = 0; i < array[0].length; i++) {
        int oneCount = 0;
        boolean flag = false;
        for (int j = 0; j < array.length; j++) {
            if (array[j][i] == 1) {
                oneCount++;
            }
        }
        if (oneCount > 5) {
            flag = true;
        }
        System.out.println("Column " + (i + 1) + ": " + flag);
    }
    System.out.println();
}

}

Всего 3 ответа


for (int i = 0; i < 10; i++) {
    int oneCountRow = 0;
    int oneCountColumn = 0;
    for (int j = 0; j < 10; j++) {
        if (array[i][j] == 1) {
            oneCountRow++;
        }
        if (array[j][i] == 1) {
            oneCountColumn++;
        }
    }

    System.out.println("Row " + (i + 1) + ": " + (oneCountRow > 5));
    System.out.println("Column " + (i + 1) + ": " + (oneCountColumn> 5));
}

или бесплатно:

    int maxLenght = 0;
    for (int i = 0; i < array.length; i++) {
        maxLenght = Math.max(maxLenght, array[i].length);
    }
    maxLenght = Math.max(maxLenght, array.length);
    for (int i = 0; i < maxLenght; i++) {
        int oneCountRow = 0;
        int oneCountColumn = 0;
        for (int j = 0; j < maxLenght; j++) {
            if (j < array[i].length && i < array.length && array[i][j] == 1) {
                oneCountRow++;
            }
            if (i < array[j].length && j < array.length && array[j][i] == 1) {
                oneCountColumn++;
        }

        System.out.println("Row " + (i + 1) + ": " + (oneCountRow > 5));
        System.out.println("Column " + (i + 1) + ": " + (oneCountColumn> 5));
}

Вы можете попытаться собрать булевы в двух плоских массивах. Один для столбцов и один для строк. Тогда вам нужен только один вложенный цикл и используйте соответствующий индекс для этих двух плоских массивов.


Вот мои мысли о решении:

Вы можете создать «массив подсчета» размера max(n, m) * 2 где n и m - размеры матрицы и инициализировать ее с помощью 0 s. 2 представляет, подсчитывает ли он столбец или строку (например, индекс 0 представляет столбцы и 1 строку). Затем вы увеличиваете репрезентативное значение в этом массиве, когда найдете 1 (для обоих столбцов и строк). Поиск правильного индекса - это вопрос какой-то модульной арифметики.


Есть идеи?

10000