'镜像'二维数组[Java]

时间:2017-02-20 17:53:32

标签: java arrays

我试图在Java中制作“2维”数组,用1到6之间的随机数填充自己(编辑:我的意思是0和5,正如代码目前所做的那样 - 我的道歉)。但是,我希望这些数字能够在假想的最佳拟合线上“镜像”,就像处理图形一样。例如,如果标记[1] [4]的数字是3.0,我希望[4] [1]的数字也是3.0。我目前处理的代码片段如下所示:它的价值(我在代码中的另一个点将array.length建立为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]

正如你所看到的那些数字反映出来而有些数字没反映出来(我怀疑这些数字纯粹是运气不好),而我正在努力解决这个问题。我会很感激任何建议 - 如果这个问题已在其他地方得到解决,我也会接受一个链接,因为我自己找不到它。

谢谢。

3 个答案:

答案 0 :(得分:2)

由于fig=plt.figure(figsize=(15,15)) ax1=fig.add_subplot(2,2,1) ax2=fig.add_subplot(2,2,2) ax2=fig.add_subplot(2,2,3) ax2=fig.add_subplot(2,2,4) ax1.set_xticks(np.arrange(1,5000,500)) ax2.set_xticks(np.arrange(1,5000,500)) ax3.set_xticks(np.arrange(1,5000,500)) ax4.set_xticks(np.arrange(1,5000,500)) 仅镜像了不是0的值。如果删除if语句,代码将起作用。

random.nextInt(6)也会生成0(含)和6(不包括)之间的整数,因此生成0,1,2,3,4或5。

所以要生成1-5(含)数,你必须做random.nextInt(5)+1

所以for循环将成为:

if(populationArray[i][j] != 0)

但是我想指出所有的位置都是两次随机值。对于创建单个6x6阵列,差异不会非常明显。但是如果你打算创建更大/更多的数组,我建议你优化你的代码,以避免给数组中的每个点赋值两次。

您可以将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]; } } 更改为j<populationArray[i].length

来优化此操作
j<=i

答案 1 :(得分:0)

你的问题是这些行

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

如果populationArray[i][j] = random.nextInt(6);返回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];
        }
    }

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

答案 2 :(得分:-1)

如果您的阵列变大,您可能希望通过不设置每个元素两次来节省时间。因此,在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是一个平方。否则会更复杂......