【问题标题】:Symmetric 2D array of random numbers随机数的对称二维数组
【发布时间】:2021-04-19 22:40:52
【问题描述】:
public static int[][] Matrix(int n, int max, int min) {
    int[][] grid = new int[3][3];
    Random rand = new Random();

    rand.setSeed(System.currentTimeMillis());

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < i; j++) {
            int value = Math.abs((min + rand.nextInt((max - min) + 1)));
            grid[i][j] = value;
            grid[j][i] = value;
        }
    }
    return grid;
}

以下代码打印一个二维对称数组,其中值是范围(最小值和最大值)之间的随机数,打印以下结果作为示例:

0 14 11 
14 0 17 
11 17 0 

我的代码问题是它只打印0 作为对角线值。如何更改它以打印设置为 int min 而不是 0 的对角线值?例如,在上面的代码中 int min 是 8 因此它会给出这样的结果:

8 14 11 
14 8 17 
11 17 8 

【问题讨论】:

  • PrintArray 是内置的 java 方法还是您创建的方法? Java 可以识别它。
  • @ColeHenrich 我创建了一个单独的方法,我没有在这段代码中添加
  • 请添加,谢谢!

标签: java arrays matrix multidimensional-array


【解决方案1】:

如果要将对角线设置为下变量,则需要做两件事。

第一,因为你设置了 j 来访问对角线

for(int i = 0; i < n; i++)
{
    for(int j = 0; j <= i; j++)
    {
        ...
    }
}

二,一旦 i 等于 j,您需要添加一个 if 语句来检查它们是否相等。如果它们是,只需将当前网格单元设置为较低的变量。不要忘记将代码块的另一半用 else 块括起来,否则会出现意外行为:

for(int j = 0; j <= i; j++) 
{
    if(i == j)
    {
        grid[i][j] = lower;
    }
    else
    {
        ...
    }
}

最后,你的整个 for 循环块应该是这样的:

for(int i = 0; i < n; i++) 
{
    for( int j = 0; j <= i; j++) 
    {
        if(i == j)
        {
            grid[i][j] = lower;
        }
        else
        {
            int value = Math.abs((lower + rand.nextInt((upper - lower) + 1)));   
            grid[i][j] = value;
            grid[j][i] = value;
        }  
    }
}

【讨论】:

  • 我还有另一个与同一个问题相关的问题。我希望这段代码能够在 n
  • 当你说你想返回null时,你的意思是如果n太小你只是想让代码打印null?
  • 是,如果 n
【解决方案2】:

您正在为所有ij 生成随机值,i==j 除外,它们是对角线值。此外,对角线的所有值都将相同。因此,在返回网格之前,您可以生成最后一个随机值并将其放在对角线上。像这样的

int diagonalValue = Math.abs((min+ rand.nextInt((max- min) + 1)));   
for( int k=0 ; k<n ; k++) 
{
    grid[k][k] = diagonalValue;
}

【讨论】:

    【解决方案3】:

    代码审查:

    • 在方法的开头添加无效的语法检查;
    • Math.abs 是多余的;
    • 内循环应包括上限;

    您的代码可能如下所示:

    public static int[][] matrix(int n, int max, int min) {
        // incorrect matrix size
        if (n <= 0)
            return new int[][]{{}};
        int[][] grid = new int[n][n];
        // incorrect random value bound
        if (max - min <= 0)
            return grid;
    
        Random rand = new Random();
        // interval excluding upper bound
        IntStream.range(0, n).forEach(i ->
                // interval including upper bound
                IntStream.rangeClosed(0, i).forEach(j -> {
                    if (i == j) {
                        // main diagonal
                        grid[i][j] = min;
                    } else {
                        // peripheral elements
                        int value = min + rand.nextInt((max - min) + 1);
                        grid[i][j] = value;
                        grid[j][i] = value;
                    }
                }));
        return grid;
    }
    
    public static void main(String[] args) {
        Arrays.stream(matrix(5, 9, 1))
                .map(Arrays::toString)
                .forEach(System.out::println);
    }
    

    输出:

    [1, 6, 3, 3, 2]
    [6, 1, 9, 4, 2]
    [3, 9, 1, 6, 7]
    [3, 4, 6, 1, 9]
    [2, 2, 7, 9, 1]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2017-10-07
      • 2015-06-29
      • 2012-07-27
      • 2017-04-17
      • 1970-01-01
      相关资源
      最近更新 更多