有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中替换2D数组中的数字?

我有一个函数,它可以找到第一个最小值并从2d数组返回:

public static int getMinimumValueOfTerrain(int[][] terrain) {
    int min = Integer.MAX_VALUE;
    for (int row = 0; row < terrain.length; row++) {
        for (int col = 0; col < terrain[row].length; col++) {
            min = Math.min(min, terrain[row][col]);
        }
    }
    return min;
}

我有另一个函数,应该用它的负值替换找到的最小值:

public static int[][] replaceMinusValue(int[][] terrain) {
    for (int row = 0; row < terrain.length; row++) {
        for (int col = 0; col < terrain[row].length; col++) {
            int tempValue = getMinimumValueOfTerrain(terrain);
            int minusValue = -tempValue;
        }
    }
    return terrain;
}

例如:

^{tb1}$

预期成果:

^{tb2}$

我如何使用我的函数来处理它


共 (3) 个答案

  1. # 1 楼答案

    您还应该将min的行和列索引保留在getMinimumValueOfTerrain中。在for循环之后,您可以将terrain[minRow][minColumn]更改为负值。我认为如果没有约束,只有getMinimumValueOfTerrain方法就足够了。如果有,您可以编写另一个返回索引的2元素数组的函数

  2. # 2 楼答案

    更快的实现是检测最小值的行和列坐标并修改该值:

    public static int[][] findAndReplaceMinValue(int[][] terrain) {
        int min = Integer.MAX_VALUE;
        int minRow = -1, minCol = -1;
    
        for (int row = 0; row < terrain.length; row++) {
            for (int col = 0; col < terrain[row].length; col++) {
                if (terrain[row][col] < min) {
                    min = terrain[row][col];
                    minRow = row;
                    minCole = col;
                }     
            }
        }
        if (minRow != -1 && minCol != -1) {
            terrain[minRow][minCol] *= -1;
        }
        return terrain;
    }
    

    如果必须在getMinimumValueOfTerrain中重用现有方法getMinimumValueOfTerrain,则应再次找到min元素,并可应用嵌套循环中的break

    public static int[][] replaceMinusValue(int[][] terrain) {
        int min = getMinimumValueOfTerrain(terrain);
    
        out: 
        for (int row = 0; row < terrain.length; row++) {
            for (int col = 0; col < terrain[row].length; col++) {
                if (min == terrain[row][col]) {
                    terrain[row][col] *= -1; // or -min
                    break out;
                }    
            }
        }
        return terrain;
    }
    
  3. # 3 楼答案

    你有多种选择。如果只执行一次,或者效率无关紧要,则可以在整个数组中循环,找到最小的元素,然后替换该元素。例如:

    public static void replaceMinusValue(int[][] terrain) {
        int min = Integer.MAX_VALUE;
        int minI = -1;
        int minJ = -1;
        for (int i = 0; i < terrain.length; i++) {
            for (int j = 0; j < terrain[i].length; j++) {
                if (terrain[i][j] < min) {
                    min = terrain[i][j];
                    minI = i;
                    minJ = j;
                }
            }
        }
    
        terrain[minI][minJ] *= -1;
    }
    

    我会那样做的。请注意,翻转后不需要返回地形(就像排序时不返回新数组一样)