2012-11-19 36 views
9

क्या एक बहुआयामी सरणी पर रेंज और लेन का उपयोग करना संभव है?जाओ: बहुआयामी सरणी की रेंज और लेन?

या तो वर के साथ एक [3] int8 या

package main 

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

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

दोनों 0 1 2 3 उत्पादन?

डाइस्ट्रॉय के उत्तर के लिए धन्यवाद, यहां एक 3-आयामी सरणी लिखने और पढ़ने का एक उदाहरण है जिसे मैं अनुकूलित करने में सक्षम था (यहां पोस्ट करना क्योंकि मुझे इसके किसी भी उदाहरण को खोजने में बहुत परेशानी थी, इसलिए शायद यह किसी और की मदद करेगी):

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

} 

उत्तर

7

अधिकांश भाषाओं में जाने के रूप में, जिसे आप एक बहुआयामी सरणी कहते हैं, सरणी की एक सरणी है। len ऑपरेटर केवल आपको "बाहरी" सरणी की लंबाई देता है।

शायद वर घोषणा यदि आप इसे के रूप में

var a [3]([5]int8) 

जो भी संकलित देख आप के लिए स्पष्ट हो सकता है। यह आकार 3 की एक सरणी है जिसका तत्व int8 के आकार 5 के सरणी हैं।

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 
} 

आउटपुट

5 
5 
5 
3 
सुरक्षित रूप से पूरे मैट्रिक्स के माध्यम से पाश के लिए

, तो आप ऐसा कर सकते हैं:

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

आप सामग्री को बदलने की जरूरत है, तो आप ऐसा कर सकते हैं

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

एक बहुआयामी सरणी की सामग्री के माध्यम से लूपिंग का एक अच्छा तरीका क्या है, अगर सरणी के आकार को ज्ञात/याद नहीं किया जाता है? 'लेंस (ए) 'और' _, var: = श्रेणी ए' के ​​आधार पर 2 loops? क्या '_, _, var: = range a' के रूप में 3 (या अधिक) आयामी सरणी के लिए रेंज स्केल का उपयोग करने का तरीका है? – kilves76

+0

मैंने लूप के समाधान के साथ संपादित किया: आपको दो लूप की आवश्यकता है। –

+0

उदाहरण के लिए धन्यवाद, मुझे कहीं भी नहीं मिला। – kilves76

0

नहीं, पहला वाला 0,1, 2 (रेंज में के सूचकांक)

http://play.golang.org/p/0KrzTRWzKO

और दूसरा एक 3 (सरणी की लंबाई) पैदा करता है।

http://play.golang.org/p/0esKFqQZL0

दोनों ही मामलों में आप सबसे बाहरी सरणी का उपयोग कर रहे हैं।

+0

यह "या तो" के लिए कम था var [3] int8 या var एक [3] [5] int8 "के साथ। – kilves76