2012-07-24 126 views
5

我想圍繞着三維數組。我明白他們是二維數組的數組,但我正在閱讀的書說了讓我困惑的東西。瞭解三維陣列

在我正在閱讀的這本書的練習中,它要求我爲全色圖像製作一個三維數組。它給出了一個小例子,說這句話的:

如果我們決定選擇一個三維數組,這裏是如何的陣列可以聲明:

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

然而,那豈不是更像這樣有效嗎?

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

其中3是rgb值,0是紅色,1是綠色,2是藍色。對於後者,每個二維數組將存儲行和列的顏色值,對嗎?我只是想確保我明白如何有效地使用三維數組。

任何幫助將不勝感激,謝謝。

+0

這是一樣的。只要保持一致,您可以隨心所欲地使用尺寸。沒有性能或內存差異。 – Bohemian 2012-07-24 04:07:56

+0

你爲什麼認爲訂單有所作爲? – Luxspes 2012-07-24 04:13:28

+0

@Luxspes我不相信。我知道。 – Bohemian 2012-07-24 04:16:23

回答

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 2012-07-24 04:28:39

+0

@ Gazzonyx正確。固定。 – Strelok 2012-07-24 04:31:18

1

順序應該不重要,所以一個不是比另一個更有效。唯一重要的是,無論訪問colorImage知道哪個維度用於什麼。在多維陣列上位更多上下文here

0

我不知道,如果它是一個好主意,把一切都在一個int數組3維。

你的第一個錯誤是dataytpe: RGB是一個int。 但R是一個字節,G是一個字節,B是字節太..(Color.getXXX()提供一個int,我不知道爲什麼,因爲它是一個字節0-255)

你需要一個int,因爲要解決超過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公衆對你的整個應用程序 - 我會改變類的設計更加安全。