在数组中的列和行中找到最大的数字

时间:2018-11-20 14:45:59

标签: java arrays multidimensional-array max

我想制作一个可以在每一行和每一列中输出最大数量的程序。
这是我的源代码:

for (int i = 0; i < Array1.length; i++) {
    for (int j = 0; j < Array1[0].length; j++) {
        if (Array1[i][j] > rowMax) {
            rowMax = Array1[i][j];
            column = j;
        }
    }

    for (int k = 0; k < Array1.length; k++) {
        if (Array1[k][column] > rowMax) {
            columnMax = Array1[k][column];
        }
    }

    if (rowMax > columnMax) {
        max = rowMax;
        System.out.println("The max number is " + max + " in [" + i + "][" + column + "]");
    } else {
        max = columnMax;
        System.out.println("The max number is " + max + " in [" + i + "][" + column + "]");
    }

    max = 0;
}

预期输出应如下所示:

  

99 28 45 62 89
  41 85 22 12 20
  10 11 15 13 90

输出将为 99 85 90 ,因为第一行和第一列中99是最大,而85是在第二行和第二列中最大,依此类推。
但另一方面,我的程序输出如下:

  

[0] [0]中的最大数量为99
  [1] [0]
中的最大数目为99   [2] [0]

中的最大数量为99

我的源代码有什么问题?

3 个答案:

答案 0 :(得分:0)

您必须在每次迭代之前将这些变量rowMaxcolumncolumnMaxmax重置为0,因为现在将rowMax的值保持为99

答案 1 :(得分:0)

使用一种按行和列存储最大值的数据结构,可以使您的生活更加轻松。取两个Map<Integer, Integer>并将行号和列号分别存储为键和将最大值存储为值。您可以根据需要在每次迭代中刷新它们。然后,将它们打印出来:

public static void main(String[] args) {

    int[][] arrayOne = new int[][] { 
        {  1, 3, 54, 25, 22 },
        { 67, 2,  0, 77, 10 },
        {  2, 4, 55, 26, 23 },
        { 65, 1, 99, 88, 11 }
    };

    // data structures that hold the row or column number and the corresponding maximum value
    Map<Integer, Integer> rowMaxima = new HashMap<Integer, Integer>();
    Map<Integer, Integer> columnMaxima = new HashMap<Integer, Integer>();

    // iterate over the rows
    for (int row = 0; row < arrayOne.length; row++) {

        // for every row, iterate over the columns
        for (int column = 0; column < arrayOne[row].length; column++) {
            // print the values in order to see if the iteration is correct
            System.out.println("arrayOne[" + row + "][" + column + "] is " + arrayOne[row][column]);

            // update the value of the current row's maximum value
            if (rowMaxima.get(row) == null || arrayOne[row][column] > rowMaxima.get(row)) {
                rowMaxima.put(row, arrayOne[row][column]);
            }

            // update the value of the current column's maximum value
            if (columnMaxima.get(column) == null || arrayOne[row][column] > columnMaxima.get(column)) {
                columnMaxima.put(column, arrayOne[row][column]);
            }
        }
    }

    // print all maxima of the rows
    rowMaxima.forEach((key, value) -> {
        System.out.println("Maximum value of row " + key + " is " + value);
    });

    // print all maxima of the columns
    columnMaxima.forEach((key, value) -> {
        System.out.println("Maximum value of column " + key + " is " + value);
    });
}
  

请注意,由于开头null为空,因此需要检查Map,否则将在NullPointerException处引起rowMaxima.get(row)

答案 2 :(得分:0)

Array1具有三行五列。查看所需的输出,应该有三个值。您的代码逐行工作。但是变量rowMaxcolumnMax是为整个数组而不是为每一行或每一列设置的。因此,它们被设置为表的最大值99。由于此值已经出现在第一行,并且您正在为每一行打印最大数量,因此它永远不会更改为更高的值。

使用Java8 +流,我们可以使用方法IntStream.max简化逻辑。我们可以将整体任务分解为两个较小的任务:在一行中找到最大值,在一列中找到最大值。

protected static int getMaxOfRow(int[][] table, int row) {
    return Arrays.stream(table[row]).max().getAsInt();
}

protected static int getMaxOfColumn(int[][] table, int column) {
    return IntStream.range(0, table.length).map(i -> table[i][column]).max().getAsInt();
}

基于此,我们可以定义一种方法,以在特定索引处获取行和列的最大值:

protected static int getMaxOfRowColumn(int[][] table, int index) {
    return Math.max(getMaxOfRow(table, index), getMaxOfColumn(table, index));
}

应用您的示例:

public static void main(String[] args) {
    int[][] table = new int[3][];
    table[0] = new int[] { 99, 28, 45, 62, 89 };
    table[1] = new int[] { 41, 85, 22, 12, 20 };
    table[2] = new int[] { 10, 11, 15, 13, 90 };

    for (int i = 0; i < table.length; i++) {
        int max = getMaxOfRowColumn(table, i);
        System.out.println(max);
    }
}

输出为:

99
85
90

编辑:
如果您不想使用Stream,只需使用for循环实现前两种方法。您仍将保留可读的设计。

protected static int getMaxOfRow(int[][] table, int row) {
    int[] r = table[row];
    int max = r[0];
    for (int i = 1; i < r.length; i++) {
        if (max < r[i]) {
            max = r[i];
        }
    }
    return max;
}

protected static int getMaxOfColumn(int[][] table, int column) {
    int max = table[0][column];
    for (int i = 1; i < table.length; i++) {
        if (max < table[i][column]) {
            max = table[i][column];
        }
    }
    return max;
}

请注意:此代码需要一个至少包含一行和一列的数组。未初始化的数组或空数组或and和具有空行的数组将导致异常。