测试2D数组的每一行和每一列中元素的存在-Java

时间:2018-10-22 09:14:41

标签: java arrays for-loop

我写了一个简短的程序,用0和1随机填充10x10 2D数组。我要检查数组以查看每一行和每一列是否包含五个以上的1。

我已经使用2个单独的嵌套for循环完成了此操作,但是有没有一种方法可以仅使用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---\n");
    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---\n");

    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 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

您可以尝试将布尔值收集为两个平面数组。一个用于列,一个用于行。然后,您只需要一个嵌套循环,并为这两个平面数组使用适当的索引即可。

答案 2 :(得分:0)

这是我对解决方案的看法:

您可以创建大小为max(n, m) * 2的“计数数组”,其中nm是矩阵的维度,并用0 s进行初始化。 2代表是对列还是行进行计数(例如,索引0代表列和1行)。然后,当您找到1(针对列和行)时,您将在该数组中增加代表值。找到正确的索引只是一些模块化算法的问题。