'Mirroring'二维数组 [Java]



我正在尝试在Java中制作" 2维"阵列,该数组以1到6之间的随机数量填充自身(编辑:我的意思:我的意思是0和5,就像代码当前一样 - 道歉)。但是,我希望这些数字在假想的最佳拟合中"镜像",好像在处理图形一样。例如,如果指示[1] [4]的数字为3.0,我希望[4] [1]的数字也为3.0。我目前拥有的代码片段在下面是值得的(我已经在代码的另一点上建立为6):

Random random = new Random();
        int n = array.length;
        double [][] populationArray = new double [n][n];
        for (int i=0; i<populationArray.length; i++){
            for (int j=0; j<populationArray[i].length; j++) {
                populationArray[i][j] = random.nextInt(6);
                if (populationArray[i][j] != 0) {
                    populationArray[j][i] = populationArray[i][j];
                }
            }
        }
        for (double[] p : populationArray) {
            System.out.println(Arrays.toString(p));
        }

目前印刷为:

[0.0, 1.0, 2.0, 1.0, 5.0, 2.0]
[1.0, 3.0, 5.0, 1.0, 3.0, 1.0]
[2.0, 5.0, 4.0, 1.0, 4.0, 1.0]
[1.0, 1.0, 1.0, 4.0, 2.0, 2.0]
[5.0, 3.0, 0.0, 2.0, 4.0, 4.0]
[2.0, 1.0, 0.0, 0.0, 4.0, 1.0]

您可以看到一些数字反映出,有些人不反映(我怀疑那些完全不运气的人),我正在为此逻辑挣扎。我将感谢任何建议 - 如果在其他地方解决了这一点,我也会链接,因为我自己找不到它。

谢谢。

因为if(populationArray[i][j] != 0)仅镜像0的值。如果删除if statment,则代码将起作用。

也随机。nextint(6)将生成一个整数(包含)和6(独家),因此将生成0,1,2,3,4或5。

因此,要生成数字1-5(包含),您必须进行随机进行。Nextint(5) 1

因此,for循环将成为:

for (int i=0; i<populationArray.length; i++){
        for (int j=0; j<populationArray[i].length; j++) {
            populationArray[i][j] = random.nextInt(5)+1;
            populationArray[j][i] = populationArray[i][j];
    }
}

但是,我想指出,所有位置均两次为随机值。为了创建一个6x6数组,差异不会很明显。但是,如果您打算创建更大的/许多数组,我建议您优化代码,以避免将数组中的每个位置给予两次值。

您可以通过将j<populationArray[i].length更改为 j<=i

来优化它
for (int i=0; i<populationArray.length; i++){
    for (int j=0; j<=i; j++) {
        populationArray[i][j] = random.nextInt(5)+1;
        populationArray[j][i] = populationArray[i][j];
    }
}

您的问题是这些行

populationArray[i][j] = random.nextInt(6);
if(populationArray[i][j] != 0) {
    populationArray[j][i] = populationArray[i][j];
}

如果 populationArray[i][j] = random.nextInt(6);返回0,则不会反映0。我怀疑您想要populationArray[i][j] = random.nextInt(5)+1;这将返回1到6之间的随机数。

奖励:您的代码现在可以正常工作,但实际上正在编写每个单元格两次。它将写入[1,4],然后镜像[4,1],但随后它将继续循环并写入[4,1],然后镜像[1,4]来解决此问题,您需要添加一张支票以查看如果是在写信之前为0。巧合的是,最终将您的if语句移动一行。

    for (int i=0; i<populationArray.length; i++){
        for (int j=i; j<populationArray[i].length; j++) {
            populationArray[i][j] = random.nextInt(5)+1;
            populationArray[j][i] = populationArray[i][j];
        }
    }

编辑:根据卢克的评论更改解决方案。请注意第二个更改对语句的int j=i

如果您的数组变得更大,则可能需要通过两次设置每个元素来节省时间。因此,直到populationArray[i].length

才能运行您的内部循环
for (int i=0; i<populationArray.length; i++){
        for (int j=0; j<populationArray[i].length-i; j++) {
            populationArray[i][j] = random.nextInt(6);
            int oppositI = populationArray.length -1 - i;
            int oppositJ = populationArray[i].length -1 - j;
            populationArray[oppositI][oppositJ] = populationArray[i][j];
    }
}

这假设您的populationArray是一个SQARE。否则会更复杂...

最新更新