我在上课时遇到了这个问题,我一直坚持下去。我做了很多研究,但无法修复我的代码。
我需要创建一个矩阵并在最大值的行中找到最小值(我相信此元素称为 minimax )。我正在尝试使用一个简单的3 x 3矩阵。我到目前为止所拥有的:
Scanner val = new Scanner(System.in);
int matrizVal[][] = new int[3][3];
for (int a = 0; a < matrizVal.length; a++) {
for (int b = 0; b < matrizVal.length; b++) {
System.out.print("(" + a + ", " + b + "): ");
matrizVal[a][b] = val.nextInt();
}
}
int largest = matrizVal[0][0];
int largestrow = 0;
int arr[] = new int[2];
for (int row = 0; row < matrizVal.length; row++){
for (int col = 0; col < matrizVal.length; col++){
if (largest < matrizVal[row][col]){
largest = matrizVal[row][col];
largestrow = row;
}
}
}
为了找到所谓的minimax元素,我决定为每个循环创建一个,并获得除最大行以外的所有maximumrow值。
for (int i : matrizVal[largestrow]){
if (i != largest){
System.out.print(i);
}
}
在这里我被卡住了!我只是想对这个整数进行“排序”并取第一个值,那就是最小最大值。我正在考虑创建一个大小为[matrizVal.length-1]的数组,但不确定是否可以使用。
我对该主题做了很多研究,但似乎无济于事。欢迎任何提示。
(我不认为是这样,但是如果重复则表示歉意)
答案 0 :(得分:1)
鉴于您提供的代码,matrizVal[largestrow]
应该是包含最高价值元素的矩阵行。
鉴于您的任务是提取此数组中的最小值,因此有很多选择。
如果只想提取最小值,那么天真的方法与确定最大值的方式类似,只是尺寸减小了一个。
例如:
int min = matrizVal[largestrow][0];
for (int i = 0; i < matrizVal.length; i++) {
if (matrizVal[largestrow][i] < min) {
min = matrizVal[largestrow][i];
}
}
// min will be the target value
或者,如果要对数组进行排序,以使数组的第一个元素始终最小,请首先确保制作了一个数组副本,以避免变异原始矩阵。然后随时使用您选择的任何排序算法。 Arrays.sort()
应该足够。
答案 1 :(得分:0)
您可以通过扫描每一行中的最大值和最小值来简化方法,然后根据前几行中的最大值来决定如何处理这些值。像这样(未经测试)的东西应该起作用:
int largestValue = Integer.MIN_VALUE;
int smallestValue = 0; // anything, really
for (int[] row : matrizVal) {
// First find the largest and smallest value for this row
int largestRowValue = Integer.MIN_VALUE;
int smallestRowValue = Integer.MAX_VALUE;
for (int val : row) {
smallestRowValue = Math.min(smallestRowValue, val);
largestRowValue = Math.max(largestRowValue, val);
}
// now check whether we found a new highest value
if (largestRowValue > largestValue) {
largestValue = largestRowValue;
smallestValue = smallestRowValue;
}
}
这不会记录行索引,因为听起来好像您不需要找到它。如果这样做,则将外部增强型for
循环替换为使用显式索引的循环(与当前代码一样),并记录下该索引。
我不会打扰任何排序,因为(1)破坏了原始数据的顺序(或引入了制作副本的费用),并且(2)具有比一次性扫描数据更高的复杂性
答案 2 :(得分:0)
您可能想考虑使用Java 8 Stream
的另一种选择:
int[] maxRow = Arrays.stream(matrizVal).max(getCompertator()).get();
int minValue = Arrays.stream(maxRow).min().getAsInt();
其中getCompertator()
的定义是:
private static Comparator<? super int[]> getCompertator() {
return (a1, a2)->
Integer.compare(Arrays.stream(a1).max().getAsInt(),
Arrays.stream(a2).max().getAsInt()) ;
}
请注意,如果两行包含相同的最大值,它可能不会为您提供(未定义的)所需输出。