2017-02-20 11 views
3

Javaで2次元配列を作成しようとしていますが、1から6までの乱数で埋め込みます(編集:私は0と5を意味します。現在 - 私の謝罪)。しかし、グラフを扱う場合のように、数字を想像上のベスト・ライン・フィッティングよりも「ミラーリング」したいと思います。たとえば、indicies [1] [4]の数字が3.0の場合、[4] [1]の数字も3.0にしたいと思います。二次元配列をミラーリングする[Java]

:これは、現在のように印刷さ

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)); 
     } 

:コードのスニペットは、私は現在、これを扱うには何の価値がある(私はArray.lengthと、コード内の別のポイントで6として確立している)のために、下記であることを持っています

[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] 

数字のいくつかは反映されていますが、一部は表示されません(純粋に運がないものと思われます)。これのロジックには苦労しています。何か提案がありがたいです。もしこれが他のところで解決されていれば、私は自分で見つけることができないので、リンクも取ることになります。

ありがとうございます。

+0

'if(populationArray [i] [j]!= 0)'があなたの問題だと思われます。それが反映されるかどうかは本質的にランダムです。また、以前に反映された値を乱数で上書きしています。 –

+0

0.0の値を除いて、配列は実際にはミラーリングされているはずです。 if条件を削除しても問題ありません。 – reden

+1

あなたのループはあなたの配列の*すべての*位置をカバーしますが、それらはすべての配列位置の半分*をカバーするだけです。 –

答えて

2

if(populationArray[i][j] != 0)のため、0でない値のみがミラーリングされます。 if文を削除すると、コードが機能します。

それはとても生成するために、0,1,2,3,4または5

のいずれかを生成するようにRandom.nextIntまた、(6)、(排他的)0(含む)と6の間の整数を生成しますループのためのあなたがにRandom.nextIntを行う必要があるでしょう数1-5(包括的)(5)+1

そうになります:

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]; 
    } 
} 

私はすべてのことを指摘したいと思いますがの位置にランダムな値が2回与えられます。単一の6x6アレイを作成する場合、その違いはそれほど顕著ではありません。しかし、より大きい/多くの配列を作成する予定があるなら、配列の各スポットに値を2度与えないようにコードを最適化することをお勧めします。

あなたはj<=ij<populationArray[i].lengthを変更することで、これを最適化することができます。

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]; 
    } 
} 
+1

ですが、必要な時間の2倍の時間がかかります。これは問題ではありませんが、言及する必要があります。 –

+0

これは完全にうまくいった - 私はそれを言ったはずだが、コンパイルの時間は私が心配している要因ではない。ありがとうございました! – Juniper

+3

また、配列の半分をループするとコードがわずかに少なくなることにも言及する価値があります。 'j

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の間の乱数を返すことを望んでいると思う。

ボーナス:あなたのコードは今では動作するが、実際には各セルを2回書く。 [1、4]とミラーを[4、1]に書き込みますが、ループを続けて[4、1]に上書きし、[1,4]にミラーすると、これを修正するために、それが書かれる前に0であれば。偶然にも、あなたはif文を1行上に動かすことになります。

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]; 
     } 
    } 

編集:ルークのコメントに基づいて解決策を変更しました。 2番目のforステートメントのint j=iへの変更に注意してください。

+1

これはちょっとハックだと思っています。配列の半分をループするだけでいいです(つまり、 'j <= i'のようなものです)。 –

+0

私は0から5の間のランダムな倍数を指定するように、そこに0を入れたいと思いました。それは私の考えであった私の論理でした - 私はそれが特に指定されない限り、0で指標を設定すると仮定していました。反映する必要はありません。私はそれらをすべて無関係に反映させるためになぜ私には起こらなかったのか分かりません。 効率性に関する注釈をありがとう - 私の強い訴訟は決してありませんでしたが、あなたの説明は完璧です。 – Juniper

+0

@ Juniper Luke Briggsのコメントによれば、2番目のforループを変更するだけで、配列の半分以上を繰り返すことができます。 – Joe

-1

配列が大きくなる場合は、各要素を2回設定しないことで時間を節約できます。これはあなたのpopulationArrayがsqareであることを前提としてい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]; 
    } 
} 

まで、したがって、あなたの内側のループを実行しないでください。もっと複雑なものになるでしょう...

+0

私はむしろこれが間違っていると確信しています - それはアレイのチャンクが決して訪問されないようにします。正しい形式は 'j

+0

@LukeBriggsそれは他の対角線をやっている... –