我想制作一个可以在每一行和每一列中输出最大数量的程序。
这是我的源代码:
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
中的最大数量为99
[1] [0]
中的最大数目为99 [2] [0]
我的源代码有什么问题?
答案 0 :(得分:0)
您必须在每次迭代之前将这些变量rowMax
,column
,columnMax
和max
重置为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
具有三行五列。查看所需的输出,应该有三个值。您的代码逐行工作。但是变量rowMax
和columnMax
是为整个数组而不是为每一行或每一列设置的。因此,它们被设置为表的最大值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和具有空行的数组将导致异常。