2009-05-14 8 views
10

Ho una matrice tridimensionale che voglio ripristinare a zero. Sembra che ci dovrebbe essere un modo semplice per fare questo che non coinvolge tre for loop:Qual è il modo migliore per impostare tutti i valori di una matrice tridimensionale su zero in Java?

for (int i = 0; i < n; i++) { 
    for (int j = 0; j < n; j++) { 
     for (int k = 0; k < n; k++) { 
      cube[i][j][k] = 0; 
     } 
    } 
} 
+0

spiacenti mia parentesi non si allineano, si ottiene il punto. –

+0

Adesso fanno Eric! :) –

+1

Non sarebbe un array tridimensionale? – Kris

risposta

29

Se si utilizza JDK 1.5 o superiore:

for (int[][] square : cube) { 
     for (int[] line : square) { 
      Arrays.fill(line, 0); 
     } 
    } 
+13

+1 per un'assegnazione dei nomi. –

+0

non necessariamente un cubo o un quadrato, ma comunque, una vera denominazione. – Mzn

13

Un array sarà pieno di zeri dopo l'inizializzazione:

int[][][] cube = new int[10][20][30]; 

Questo si può fare anche successivamente, ripristinare loro matrice a zero, esso non è limitato a dichiarazione:

cube = new int[10][20][30]; 

sufficiente creare un nuovo array, viene inizializzato con zeri. Funziona se hai un posto in cui è presente il riferimento all'array. Non preoccuparti del vecchio array, che sarà raccolto.

Se non si vuole dipendere da questo comportamento della lingua o non è possibile sostituire tutte le occorrenze di riferimenti alla vecchia matrice, che si dovrebbe andare con la Arrays.fill() come jjnguy detto:

for (int i = 0; i < cube.length; i++) 
{ 
    for (int j = 0; j < cube[i].length; j++) 
    { 
     Arrays.fill(cube[i][j], 0); 
    } 
} 

Arrays.fill sembra utilizzare anche un loop all'interno, ma sembra generalmente più elegante.

+0

Grazie. Il punto è che ho bisogno di resettare a zero dopo aver ottenuto valori diversi da zero. –

+4

quindi basta dichiarare un nuovo array, il vecchio sarà garbage collection se non c'è nulla che lo faccia riferimento a –

5
for (int i = 0; i < arr.length; i++){ 
    for (int j = 0; j < arr[i].length){ 
     Arrays.fill(arr[i][j], 0); 
    } 
} 

In questo modo si elimina un ciclo aggiuntivo utilizzando Arrays.fill;

Oppure

arr = new double[arr.length][arr[0].length][arr[0][0].length]; 

Sfortunatamente, ciò presuppone l'array è almeno length >= 1.

+0

Non riempire() basta fare la stessa cosa comunque? –

+0

Lo fa. Ho appena controllato il codice sorgente. –

+0

Sì, non è molto meglio. – jjnguy

13

Beh, sembra che si può solo abbandonare la vecchia matrice e crearne uno nuovo:

int size = 10; 
cube = new int[size][size][size]; 
+3

funziona solo se non si dispone di un riferimento al (vecchio) array altrove –

2

Nonostante il fatto che che è una matrice 3D, la soluzione più leggibile è spesso la migliore (la cosa migliore è una parola soggettiva, dovresti aver detto meglio in termini di proprietà e la leggibilità è solitamente la mia prima scelta).

Se ci fossero davvero solo tre elementi nel ciclo interno e si voleva sottolineare che ci sono stati tre colonne, si potrebbe provare questo:

for (int i = 0; i < n; i++) { 
    for (int j = 0; j < n; j++) { 
     cube[i][j][0] = 0; 
     cube[i][j][1] = 0; 
     cube[i][j][2] = 0; 
    } 
} 
1

Se tutte le righe sono della stessa lunghezza si può solo scartare la matrice e costruirne una nuova poiché il valore predefinito degli elementi int è zero.

cube = new int[cube.length][cube[0].length][cube[0][0].length]; 

Oppure si potrebbe fare

for(int[][] tda : cube) { 
    for(int[] oda : tda) { 
    java.util.Arrays.fill(oda, 0); 
    } 
} 
2

Beh, si può sempre fare questo:

Arrays.fill(cube[0][0],0); 
Arrays.fill(cube[0],cube[0][0]); 
Arrays.fill(cube,cube[0]); 

E ' un po 'più pulito di 3 anelli.

Se non si ottiene l'idea, il primo "riempimento" riempie una singola dimensione. Il secondo riempimento copia una dimensione su due dimensioni. Il terzo riempimento copia le due dimensioni su tre dimensioni.

Se non si dispone di altri riferimenti alla matrice che è necessario conservare, ricrearlo come altri hanno suggerito è probabilmente più veloce e più pulito.

+2

Non è certo una buona idea. Stai mettendo lo stesso array (oggetto) dal cubo [0] [0] nel cubo [0] [1], cubo [0] [2] ..., e poi inserendo lo stesso array dal cubo [0] nel cubo [1], cubo [2] ... se, ad esempio, si modifica il cubo [0] [1] [2] in 1, cubo [1] [1] [2], cubo [0] [0] [2], ... otterrà lo stesso 1! –

+0

Ooh, buon punto. Così tanto per i test troncati ... –

1

Basta creare un nuovo array e assegnare la variabile ad esso ... Il GC ripulire la vecchia serie

Problemi correlati