最大行中的最小元素

时间:2018-08-23 02:34:18

标签: java foreach

我在上课时遇到了这个问题,我一直坚持下去。我做了很多研究,但无法修复我的代码。

我需要创建一个矩阵并在最大值的行中找到最小值(我相信此元素称为 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]的数组,但不确定是否可以使用。

我对该主题做了很多研究,但似乎无济于事。欢迎任何提示。

(我不认为是这样,但是如果重复则表示歉意)

3 个答案:

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

请注意,如果两行包含相同的最大值,它可能不会为您提供(未定义的)所需输出。