2012-07-24 13 views
5

मैं अपने सिर को त्रि-आयामी सरणी के चारों ओर लपेटने की कोशिश कर रहा हूं। मैं समझता हूं कि वे द्वि-आयामी सरणी के सरणी हैं, लेकिन जिस पुस्तक को मैं पढ़ रहा हूं वह कुछ ऐसा है जो मुझे भ्रमित करता है।त्रि-आयामी Arrays को समझना

पुस्तक पढ़ने के लिए एक अभ्यास में, यह मुझे पूर्ण रंगीन छवि के लिए त्रि-आयामी सरणी बनाने के लिए कहता है। यह एक छोटा सा उदाहरण यह कह देता है:

हम एक तीन आयामी सरणी का चयन करने का फैसला करते हैं, तो सरणी घोषित किया जा सकता है:

int[][][] colorImage = new int[numRows][numColumns][3]; 

हालांकि, यह अधिक नहीं होगा इस तरह प्रभावी?

int[][][] colorImage = new int[3][numRows][numColumns]; 

जहां 3 आरजीबी मान हैं, 0 लाल हैं, 1 हरा है, और 2 नीला है। उत्तरार्द्ध के साथ, प्रत्येक दो-आयामी सरणी पंक्ति और कॉलम के रंग मान को संग्रहित करेगी, है ना? मैं बस यह सुनिश्चित करना चाहता हूं कि मैं समझता हूं कि प्रभावी रूप से त्रि-आयामी सरणी का उपयोग कैसे करें।

किसी भी मदद की सराहना की जाएगी, धन्यवाद।

+0

यह वही है। आप जितनी देर तक सुसंगत हो, उतनी ही आयामों का उपयोग कर सकते हैं। कोई प्रदर्शन या स्मृति अंतर नहीं है। – Bohemian

+0

आपको विश्वास क्यों है कि आदेश में कोई फर्क पड़ता है? – Luxspes

+0

@Luxspes मुझे विश्वास नहीं है। मुझे यह पता है। – Bohemian

उत्तर

1

आदेश कोई प्रभाव नहीं पड़ेगा, और वास्तव में पूर्व प्रपत्र अधिक पठनीय है:

final const int RED = 0; 
final const int GREEN = 1; 
final const int BLUE = 2; 

int[][][] colorImage = new int[numRows][numColumns][3]; 
//... 

int x = getSomeX(); 
int y = getSomeY(); 

int redComponent = colorImage[x][y][RED]; 
int greenComponent = colorImage[x][y][GREEN]; 
int blueComponent = colorImage[x][y][BLUE]; 
+1

उपरोक्त कोड में बग। आप सूचकांक 0,1,2 चाहते हैं। 1,2,3 नहीं – Gazzonyx

+0

@Gazzonyx सही। फिक्स्ड। – Strelok

1

आदेश से कोई फर्क नहीं पड़ता, इसलिए कोई दूसरे की तुलना में अधिक प्रभावी नहीं है। एकमात्र चीज जो मायने रखती है वह यह है कि रंग जो भी एक्सेस करता है, जानता है कि किस आयाम का उपयोग किया जाता है। Multidimensional arrays here पर अधिक संदर्भ बिट करें।

0

मुझे यकीन है कि नहीं कर रहा हूँ अगर इसकी एक अच्छा विचार पूर्णांक के 3dimensional सरणी में सब कुछ डाल करने के लिए।

आपकी पहली गलती डेटाटाइप है: आरजीबी एक int है। लेकिन आर एक बाइट है, जी एक बाइट है, बी एक बाइट भी है .. (Color.getXXX() किसी पूर्णांक बचाता है, मुझे पता है क्यों, क्योंकि इसके एक बाइट 0-255 न)

आप एक पूर्णांक की जरूरत है क्योंकि आप पता करने के लिए चाहते हैं 256 से अधिक कॉल & पंक्तियां। (वह ठीक है)। लेकिन मुझे लगता है कि एक अतिरिक्त वस्तु में रंग की जानकारी को समाहित करना बेहतर है। शायद की तरह

class MyColor { 

     public byte r, g, b; //public for efficient access; 
     public int color;  //public for efficient access; 

     public MyColor(final int rgb) { 
      this(new Color(rgb)); 
     } 

     public MyColor(final Color c) { 
      this((byte) c.getRed(), (byte) c.getGreen(), (byte) c.getBlue(), c.getRGB()); 
     } 

     public MyColor(final byte red, final byte green, final byte blue, final int c) { 
      this.r = red; 
      this.g = green; 
      this.b = blue; 
      this.color = c; 
     } 
    } 

और MyColor[numRows][numColumns]

के 2dim सरणी में डाल एक निजी आंकड़ा संरचना लेकिन अगर आप अपने पूरे अनुप्रयोग के लिए वर्ग MyColor सार्वजनिक करना - मैं डिजाइन वर्ग के बदल जाएगा और अधिक सुरक्षित होने के लिए ।