2012-11-19 9 views
9

È possibile utilizzare range e len su un array multidimensionale?Go: range e len dell'array multidimensionale?

O con var a [3] int8 o

package main 

func main() {  
     var a [3][5]int8 

     for h := range a { 
       println(h) 
     } 
     println(len(a)) 
} 

Entrambi producono 0 1 2 3 ?

Grazie alla risposta di dystroy, ecco un esempio di scrittura e di lettura di una matrice 3-dimensionale sono stato in grado di adattarsi (distacco qui perché ho avuto molta difficoltà a trovare alcun esempio di questo, quindi forse ciò contribuirà a qualcun altro):

package main 
func main() { 
    var a [3][5][7]uint8 

    //write values to array 
    for x, b := range a { 
     for y, c := range b { 
      for z, _ := range c { 
        a[x][y][z] = uint8(x*100+y*10+z) 
       } 
     } 
    } 

    //read values from array 
    for _, h := range a { 
     for _, i := range h { 
      for _, j := range i { 
       print(j, "\t") 
      } 
      println() 
     } 
     println() 
    } 

} 

risposta

7

In Vai come nella maggior parte delle lingue, ciò che si chiama un array multidimensionale è una matrice di matrici. L'operatore len fornisce solo la lunghezza dell'array "esterno".

Forse la dichiarazione var potrebbe essere più chiaro per voi, se lo si vede come

var a [3]([5]int8) 

che compila anche. È una matrice di dimensione 3 i cui elementi sono array di dimensione 5 di int8.

package main 
import "fmt" 
func main() { 
    var a [3][5]int8 
    for _, h := range a { 
     fmt.Println(len(h)) // each one prints 5 
    } 
    fmt.Println(len(a)) // prints 3, the length of the external array 
} 

uscite

5 
5 
5 
3 

Per eseguire un ciclo in modo sicuro attraverso l'intera matrice, si può fare questo:

for _, h := range a { 
    for _, cell := range h { 
     fmt.Print(cell, " ") 
    } 
    fmt.Println() 
} 

Se è necessario modificare il contenuto, è possibile farlo

for i, cell := range h { // i is the index, cell the value 
     h[i] = 2 * cell 
    } 
+0

quale è un modo piacevole di scorrere i contenuti di una matrice multidimensionale, se/quando la dimensione dell'array non è conosciuta/ricordata? 2 cicli basati su 'len (a)' e '_, var: = range a'? Utilizza la scala di intervalli per 3 (o più) array dimensionali come in '_, _, var: = range a'? – kilves76

+0

Ho modificato con la soluzione in loop: sono necessari due cicli. –

+0

Grazie per l'esempio, non ho potuto trovare da nessuna parte. – kilves76