2012-07-24 12 views
5

Ich versuche, meinen Kopf um dreidimensionale Arrays zu wickeln. Ich verstehe, dass sie Arrays aus zweidimensionalen Arrays sind, aber das Buch, das ich lese, sagte etwas, das mich verwirrt.Dreidimensionale Arrays verstehen

In einer Übung für das Buch, das ich gerade lese, fordert es mich auf, ein dreidimensionales Array für ein Vollfarbbild zu erstellen. Es gibt ein kleines Beispiel des sagt:

Wenn wir eine dreidimensionale Anordnung zu wählen, entscheiden, hier ist, wie das Array könnte erklärt werden:

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

jedoch

, wäre es nicht mehr sein effektiv so?

Wo 3 ist die RGB-Werte, 0 ist rot, 1 ist grün, und 2 ist blau. Bei letzterem würde jedes zweidimensionale Array den Farbwert der Zeile und Spalte speichern, richtig? Ich möchte nur sicherstellen, dass ich verstehe, wie man ein dreidimensionales Array effektiv einsetzt.

Jede Hilfe wird sehr geschätzt werden, danke.

+0

Es ist das gleiche. Sie können Dimensionen beliebig verwenden, solange sie konsistent sind. Es gibt keinen Leistungs- oder Speicherunterschied. – Bohemian

+0

Warum glauben Sie, dass die Bestellung einen Unterschied macht? – Luxspes

+0

@Luxspes Ich glaube es nicht. Ich weiß es. – Bohemian

Antwort

1

Reihenfolge keine Rolle spielt, und zwar in der ehemalige Form ist besser lesbar:

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

Fehler im obigen Code. Sie wollen Indizes 0,1,2. Nicht 1,2,3. – Gazzonyx

+0

@Gazzonyx korrekt. Fest. – Strelok

1

Die Reihenfolge sollte nicht wichtig sein, also ist eine nicht effektiver als die andere. Es kommt nur darauf an, dass colorImage unabhängig davon weiß, welche Dimension für welche verwendet wird. Bit mehr Kontext auf mehrdimensionalen Arrays here.

0

Ich bin mir nicht sicher, ob es eine gute Idee, alles in einem 3dimensional Array von int zu setzen.

Ihr erster Fehler ist der Datatype: RGB ist ein Int. Aber R ist ein Byte, G ist ein Byte, B ein Byte zu .. (Color.getXXX() liefert einen int, ich weiß nicht, warum, weil sie ein Byte 0-255)

Sie einen int braucht, weil Sie ansprechen wollen mehr als 256 Spalten & Reihen. (Das ist okay). Aber ich denke, dass es viel besser ist, die Farbinformationen in einem zusätzlichen Objekt zu kapseln. Vielleicht eine private Datenstruktur wie

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; 
     } 
    } 

und setzen diese in einer 2dim Reihe von MyColor[numRows][numColumns]

Aber wenn man die Klasse MyColor Öffentlichkeit auf Ihre ganze app machen - ich würde das Design der Klasse ändern, um sicherer zu sein .

Verwandte Themen