2009-05-26 16 views
3

Diese dumm sein könnte, aber ich möchte wissen, ob es möglich ist, lässt mit 5x5 eine MatrixWie zwei Fors kombinieren in einem

int[][] x = new int[5][5];  
Random rg = new Random(); 

jetzt wollen wir füllen sie mit Pseudo Random Informationen

starten
for(int i=0;i<5;i++){ 
    for(int j =0; j<5;j++){ 
     x[i][j] = rg.nextInt(); 
    }   
} 

aber wie kann ich das mit einer Single richtig machen?

for(int i=0, j=0; i<5; (j==5?i++, j=0:j++){ 
    x[i][j] = rg.nextInt(); 
} 

dies funktioniert nicht :(

+6

Was ist der Zweck dieser for-Schleife in einem einzigen zu machen? Sie müssen immer X * Y-Zeiten iterieren, egal ob in Einzel- oder Nested-Schleife. Ich betrachte die verschachtelte Schleife als besser lesbar. –

+0

Ich weiß, dass 2 Loops der schnellere, bessere, lesbare Weg sind, aber ich war auf diese Weise interessiert. danke für alle schnellen Antworten –

Antwort

25

Sie müssen die Zeile und Spalte aus einem einzigen Index berechnen, dann gilt:

for(int i = 0; i < 5 * 5; i++) 
{ 
    int row = i/5; 
    int column = i % 5; 
    x[row][column] = rg.nextInt(); 
} 

Die Verwendung von/und% ist klassisch, hier: Wenn Sie über die Indizes der Matrix iterieren, wird anhand der Division ermittelt, in welcher Zeile Sie sich befinden. Der Rest (%) ist dann die Spalte.

Diese herrliche ASCII-Grafik zeigt, wie die 1-dimensionalen Indizes sind in der 2D-Matrix zu finden:

0 1 2 3 4 
5 6 7 8 9 
10 11 12 13 14 
15 16 17 18 19 
20 21 22 23 24 

Es sollte klar sein, dass für jeden Wert in der ersten Reihe, die durch 5 geteilten Wert der Zeilenindex selbst, dh sie sind alle 0.

+0

Allerdings glaube ich nicht, dass es schneller sein wird als die 2-für Schuppen-Version, es ist immer noch O (n²) Komplexität. –

+0

@Bishiboosh: Nein, ich denke auch nicht, dass es schneller ist ... Ich habe es nie gesagt, ich wollte nur zeigen, wie man es mit einer einzigen Schleife macht, wie die ursprüngliche Frage. – unwind

+4

+1 für wunderschöne ascii art – willcodejavaforfood

-1
int q = 5, r= 5; 
int [][] x = new int [q][r] 

for(int i = 0, i < q * r, i++) 
{ 
    int xaxis = i/q; 
    int yaxis = i % r; 

    x[xaxis][yaxis] = rg.nextInt(); 
} 

Obwohl ich nicht weiß, warum Sie wollen ... Sie haben immer noch die gleiche Anzahl von Iterationen und das ist IMHO schwieriger zu lesen und erfordert mehr mathematische Berechnungen zu laufen, so ist es wahrscheinlich langsamer, wenn Sie es profilieren

+0

das funktioniert nicht: (1) für Verwendungen ';' als Trennzeichen, nicht ',' (2) funktioniert es nur für q == r; Wenn q r nicht alle Elemente gesetzt sind. Es sollte "int xaxis = i/r;" –

2

Eine andere Möglichkeit wäre:

int i,j; 
for (i=0,j=0; i<5 && j<5; i = (i==4 ? 0 : i+1), j = (i==4 ? j+1 : j)) 
{ 
    x[i][j] = rg.nextInt(); 
} 

Obwohl, ich bevorzuge Abwicklungslösung.

+0

mehr wie das Beispiel ich versuchte, thx –

8

Sie werden wirklich nichts davon bekommen. halten Sie Ihren Code lesbar. es ist tatsächlich intensiver, die Multiplikationen und Divisionen durchzuführen, die dann nur zu einer Schleife vorgeschlagen werden. (multiplizieren Dividieren und Mod sind eigentlich eine komplexe Reihe von Anweisungen in einer ALU)

0

Ich wurde neugierig und machte einen Benchmark.

Für Suns HotSpot 64 Server jvm unter Linux waren sowohl verschachtelte als auch nicht ausgepackte Loops mehr oder weniger gleich schnell und fast so schnell wie die Iteration über ein lineares Array von [size * size]. Die ausgepackte Schleife ist eigentlich langsamer als die verschachtelte Schleife, wahrscheinlich weil sie etwas mehr Mathematik macht.

Auf IBMs jdk 1.5 32 Bit unter Windows ist die verschachtelte Schleife jedoch mehr als 10x langsamer.

Obwohl, ich bin nicht sicher, ob seine die Compiler oder die JVM, die in diesem Fall zählt, wurde der langsame Test weicht mit IBMs RAD kompilieren einige Jahre älter als Eclipse 3.4

Also der einzige Grund zu Chaos auf Ihr Code mit diesen Optimierungen wäre, wenn Sie auf einer "Enterprisy" -Plattform mit einem alten jvm und Compiler stecken, und es ist wirklich wirklich zeitkritisch.

0

Kürzeste Lösung

int i = 0,j=0; 
for(;j<5;j+=i==4?1:0,i++){ 
    if(i==5) 
     i=0; 
    x[j][i] = rg.nextInt(); 

    } 
Verwandte Themen