Java 最大行中的最小元素
我在课堂上遇到了这个问题,我被困在这个问题上了。我做了大量的研究,但我无法修复我的代码 我需要创建一个矩阵,并在最大值的行中找到最小值(我相信这个元素称为minimax)。我试着用一个简单的3x3矩阵。到目前为止,我所拥有的:Java 最大行中的最小元素,java,foreach,Java,Foreach,我在课堂上遇到了这个问题,我被困在这个问题上了。我做了大量的研究,但我无法修复我的代码 我需要创建一个矩阵,并在最大值的行中找到最小值(我相信这个元素称为minimax)。我试着用一个简单的3x3矩阵。到目前为止,我所拥有的: Scanner val = new Scanner(System.in); int matrizVal[][] = new int[3][3]; for (int a = 0; a < matrizVal.length; a+
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。我正在考虑创建一个大小为[matrizVal.length-1]的数组,但不确定它是否有效
我在这个问题上做了很多研究,但似乎没有任何帮助。欢迎任何提示
(我不认为是,但如果是重复的,我很抱歉)您可以通过扫描每行中的最大值和最小值,然后根据前几行中找到的最大值决定如何处理这些值来简化方法。类似这样(未经测试)的方法应该有效:
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)比一次性扫描数据复杂度更高。根据您提供的代码,
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
int min=matrizVal[largestrow][0];
对于(int i=0;i
或者,如果要对数组进行排序,使数组的第一个元素始终是最小的,请首先确保制作数组的副本,以避免对原始矩阵进行变异。然后,您可以随意使用您选择的任何排序算法<代码>数组.SoTo()/Script >可能已经足够了。 < P>您可能想考虑使用java 8代码“流<代码> >:< /P>不同的替代方案。
int[] maxRow = Arrays.stream(matrizVal).max(getCompertator()).get();
int minValue = Arrays.stream(maxRow).min().getAsInt();
其中,getCompertor()
由以下内容定义:
private static Comparator<? super int[]> getCompertator() {
return (a1, a2)->
Integer.compare(Arrays.stream(a1).max().getAsInt(),
Arrays.stream(a2).max().getAsInt()) ;
}
private static comparator假设您现在拥有1D值数组(即matrizVal[largestrow]
),提取最小值应该相对简单。您的目标是实现特定的运行时复杂性吗?您对包含最大值的行进行排序的想法很好。为什么不试试呢?类中有一些方法可能会对您有所帮助。如果两行包含相同的最高值,那么预期的输出是什么?
private static Comparator<? super int[]> getCompertator() {
return (a1, a2)->
Integer.compare(Arrays.stream(a1).max().getAsInt(),
Arrays.stream(a2).max().getAsInt()) ;
}