Java 最大行中的最小元素

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+

我在课堂上遇到了这个问题,我被困在这个问题上了。我做了大量的研究,但我无法修复我的代码

我需要创建一个矩阵,并在最大值的行中找到最小值(我相信这个元素称为minimax)。我试着用一个简单的3x3矩阵。到目前为止,我所拥有的:

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