2017-02-20 10 views
3

Ich versuche ein "2-dimensionales" Array in Java zu erstellen, das sich mit Zufallszahlen zwischen 1 und 6 füllt (EDIT: Ich meinte 0 und 5, wie der Code tut derzeit - ich entschuldige mich). Ich möchte jedoch, dass die Zahlen über eine imaginäre Linie der besten Anpassung "gespiegelt" werden, so als ob es sich um ein Diagramm handelt. Zum Beispiel, wenn die Zahl bei Indizes [1] [4] 3,0 ist, möchte ich, dass die Zahl bei [4] [1] auch 3,0 ist. Der Code-Schnipsel habe ich zur Zeit, dass Angebote mit diesem unten ist, für das, was ihren Wert (ich habe array.length als 6 an einer anderen Stelle im Code festgelegt):'Spiegeln' eines zweidimensionalen Arrays [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)); 
     } 

Die derzeit druckt als:

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

Wie Sie sehen können einige der Zahlen reflektieren und einige nicht (ich vermute, diejenigen, die tun, sind Pech), und ich habe mit der Logik dieser zu kämpfen. Ich würde mich über alle Vorschläge freuen - wenn dies irgendwo anders angesprochen wurde, würde ich auch einen Link nehmen, da ich es selbst nicht finden konnte.

Vielen Dank.

+0

'if (populationArray [i] [j]! = 0) scheint Ihr Problem zu sein. Es ist im Wesentlichen zufällig, ob es reflektiert oder nicht. Außerdem überschreiben Sie zuvor reflektierte Werte mit Zufallszahlen. –

+0

Abgesehen von der 0.0 Werte-Array ist tatsächlich gespiegelt, wie Sie sagen, es sollte sein. Entfernen Sie die if-Bedingung und es sollte gut funktionieren. – reden

+1

Ihre Schleifen decken * alle * Positionen in Ihrem Array ab, aber sie sollten nur * die Hälfte * aller Array-Positionen abdecken. –

Antwort

2

Wegen der if(populationArray[i][j] != 0) werden nur die Werte gespiegelt, die nicht 0 sind. Wenn Sie die if-Anweisung entfernen, funktioniert der Code.

Auch random.nextInt (6) wird für eine ganze Zahl zwischen 0 (einschließlich) und 6 (exklusiv) erzeugen, so dass entweder generieren 0,1,2,3,4 oder 5

So zu erzeugen, eine Zahl von 1 bis 5 (einschließlich) Sie random.nextInt (5) +1

So ist die for-Schleife wird sich zu tun haben:

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

aber ich, dass alle darauf hin möchten der Positionen erhalten zweimal einen zufälligen Wert. Für die Erstellung eines einzelnen 6x6-Arrays ist der Unterschied nicht sehr auffällig. Wenn Sie jedoch größere/viele Arrays erstellen möchten, sollten Sie Ihren Code optimieren, um zu vermeiden, dass jeder Punkt im Array doppelt vergeben wird.

Sie können diese optimieren, indem j<populationArray[i].length zu 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]; 
    } 
} 
+1

, aber es wird doppelt so viel Zeit brauchen, wie es benötigt wird. OK, das ist hier kein Problem, aber es sollte erwähnt werden. –

+0

Das funktionierte perfekt - ich hätte es sagen sollen, aber die Kompilierzeit ist kein Faktor, um den ich mir Sorgen mache. Vielen Dank! – Juniper

+3

Es ist auch erwähnenswert, dass das Schleifen über die Hälfte des Arrays auch etwas weniger Code verwendet. Tausche einfach 'j

0

Ihr Problem mit diesen Linien ist

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

wenn populationArray[i][j] = random.nextInt(6); 0 zurück, als es nicht reflektiert wird. Ich vermute, Sie wollen populationArray[i][j] = random.nextInt(5)+1; Dies wird eine zufällige Zahl zwischen 1 und 6 zurückgeben.

Bonus: Ihr Code wird jetzt funktionieren, aber es ist eigentlich jede Zelle zweimal schreiben. Es wird [1, 4] schreiben und zu [4, 1] spiegeln, aber dann wird es weiter loopen und über [4, 1] schreiben und zu [1, 4] spiegeln, um das zu beheben wenn es 0 ist, bevor Sie es schreiben. Was zufälligerweise nur dazu führt, dass Sie Ihre if-Anweisung um eine Zeile nach oben verschieben.

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

EDIT: änderte die Lösung basierend auf Lukes Kommentar. Notieren Sie sich die Änderung an int j=i für die zweite Anweisung.

+1

Ich würde dies ein bisschen wie ein Hack - es wäre besser, nur über die Hälfte der Array nur Schleife (d. H. Etwas wie "j <= ich" würde das tun). –

+0

Ich wollte 0s drin, so dass es zufällige Doppelzahlen zwischen 0 und 5 bezeichnet. Es war nur meine Logik, die war ich denke - ich nahm an, dass es die Indizes mit 0 bevölkern würde, wenn nicht anders angegeben, so dass Teil würde nicht reflektiert werden müssen. Ich weiß nicht, warum es mir nicht eingefallen ist, sie alle zu reflektieren. Vielen Dank für den Hinweis auf Effizienz - das war nie meine starke Klage, aber Ihre Erklärung macht Sinn. – Juniper

+0

@Juniper Basierend auf Luke Briggs Kommentar, würde ich nur die zweite für Schleife ändern, so dass es nur über die Hälfte der Array iteriert. – Joe

-1

Wenn Ihre Arrays größer werden, sollten Sie Zeit sparen, indem Sie nicht jedes Element zweimal einstellen.Deshalb ist ihre innere Schleife nicht ausgeführt werden soll, bis 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]; 
    } 
} 

Dies setzt voraus, dass Ihr populationArray ein sqare ist. Es wird etwas komplexer sein, sonst ...

+0

Ich bin mir ziemlich sicher, dass dies falsch ist - es würde dazu führen, dass ein Teil des Arrays niemals besucht wird. Die korrekte Form ist "j <= i" anstatt "j

+0

@LukeBriggs macht es die andere Diagonale ... –

Verwandte Themen