# Frage zu mehrdimensionalen Arrays



## Guest (31. Jan 2005)

Hallo,

ich habe eine Frage zu mehrdimensionalen Arrays bzw. wie man sie deklariert. Habe ich das richtig gesehen, daß man normale Arrays per


```
int[]  testArray = {1};
```

deklariert, und mehrdimensionale Arrays per


```
int[][] testArray = {{1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}};
```

? Ganz egal wieviele Dimensionen das Array hat, man schreibt immer nur zwei [] hin um damit "anzuzeigen", daß es sich um ein mehrdimensionales Array mit beliebig vielen Dimensionen handelt (so wie oben beschrieben ein 8 dimensionales Array)?


Der Zugriff auf die einzelnen Felder erfolgt aber ganz normal per


```
testArray[0][0][0][0][0][0][0][0][1]
```
?

Danke,
Fritz

_Edit by Beni: blöde Fragen gibt es nicht_
_Edit by Illuvatar: blöde Fragen gibt es nicht Teil 2_


----------



## Wildcard (31. Jan 2005)

Nein, das hast du falsch verstanden.

```
int[][] testArray = {{1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}};
```
ist kein 8 dimensionales Array, sondern ein 2 dimensionales mit einer Spalte, und 8 Zeilen.


----------



## meez (31. Jan 2005)

```
int[][] testArray = {{1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}};
```

Das ist ja auch "nur" ein zweidimensionales Array...

Ansonsten kannst du schon sowas schreiben:

```
int[][][] zzz = new int[4][3][2];
```
oder irgenwie sowas:

```
int[][][] zzz = { { {4,5,3}, {5,4,5}, {6,5,6,5},{4,5,3}, {5,4,5}, {6,5,6,5}},   
{ {4,5,3}, {5,4,5}, {6,5,6,5},{4,5,3}, {5,4,5}, {6,5,6,5}},
{ {4,5,3}, {5,4,5}, {6,5,6,5},{4,5,3}, {5,4,5}, {6,5,6,5}},   
{ {4,5,3}, {5,4,5}, {6,5,6,5},{4,5,3}, {5,4,5}, {6,5,6,5}}  ;
```


EDIT: Mist zu langsam...


----------



## bambi (31. Jan 2005)

also 2dim array waere das:

```
int[][] my2DimArray = {{1,2,3},{4,5,6},{...}}
```


ein 3dim array waere dann also:

```
int[][][] my3DimArray = {{{1,2,3},{4,5,6},{...}} , {{1,2,3},{4,5,6},{...}} , {{1,2,3},{4,5,6},{...}}}
```

Zugriff:


```
my3DimArray[0][0][0] -> 1
my3DimArray[0][0][1] -> 2
u.s.w.
```

oder hab' ich jetzt dein problem falsch verstanden?


----------



## TP (31. Jan 2005)

Ich schließe mich gleich an was Array-Fragen angeht: Gibt es eine Methode die mir die Dimension eines Arrays zurückgibt oder muss ich mir die selber basteln?

In der JavaDoc habe ich nur Methoden gefunden die mir die Länge zurück geben.....nicht gut genug geschaut? 

ciao,
TP


----------



## Wildcard (31. Jan 2005)

Du kennst die Dimensionen doch wenn du das Array anlegst? Warum willst du das später rausfinden?


----------



## meez (31. Jan 2005)

TP hat gesagt.:
			
		

> Ich schließe mich gleich an was Array-Fragen angeht: Gibt es eine Methode die mir die Dimension eines Arrays zurückgibt oder muss ich mir die selber basteln?



Nein, weil es keine eigentlichen mehrdimensionalen Arrays gibt, sondern nur Arrays in Arrays


----------



## TP (31. Jan 2005)

verstehe....

naja ich bastle gerade zur übung eine klasse die mir die verschachetlung der arrays in der console grafisch darstellt, und ich würde das ganze gerne dynamisch anhand eines übergebenen arrays generieren lassen, daher brauche ich die dimension des arrays früher oder später 

ich muss mal grübeln ob ich dazu einen ansatz finde  ich hoffe durch solche "grundlagenforschung" mich mal mit den absoluten basics vertraut zu machen. 

noch eine frage:


```
int length = java.lang.reflect.Array.getLength( array );
```

Wieso muss man hier expliziet java.lang.reflect angeben? Ein reines 


```
int length = Array.getLength( array );
```
oder

```
int length = getLength( array );
```

funktioniert nicht. 

java.lang

wird ja automatisch importiert,

java.lang.reflect

anscheinend nicht? Finde ich unlogisch, ist reflect doch innerhalb von lang?

(ja ich muss zugeben, bei dem Kapitel Bibliotheken bin ich im Buch nocht nicht angelangt )

ciao und wiedermal danke 
TP


----------



## mic_checker (31. Jan 2005)

TP hat gesagt.:
			
		

> Ich schließe mich gleich an was Array-Fragen angeht: Gibt es eine Methode die mir die Dimension eines Arrays zurückgibt oder muss ich mir die selber basteln?



Du könntest dir doch aber noch "helfen":

Sagen wir der Einfachheitshalber du hast ein zweidimensionales array:


```
int[][] testfeld = new int[4][3];
           
           System.out.println("Anzahl der Zeilen = "+testfeld.length);
           System.out.println("Anzahl der Spalten = "+testfeld[0].length);
```


----------



## TP (31. Jan 2005)

Naja, dieses Methode kann ich ja nur anwenden wenn ich weiß wieviele Dimensionen ein Array hat oder?

Obwohl man natürlich auch pfuschen könnte und die NullPointerException abfangen könnte ;-)

Das sind so meine Vorstellungen


----------



## Beni (1. Feb 2005)

TP hat gesagt.:
			
		

> ...Wieso muss man hier expliziet java.lang.reflect angeben? Ein reines ...



Das "Alles was in java.lang ist wird erkannt"-Konzept gilt nur für Klassen und Interfaces, nicht aber für Unterpackages.

P.S.  es geht auch einfacher:

```
int length = array.length;
```


----------



## mic_checker (1. Feb 2005)

TP hat gesagt.:
			
		

> Naja, dieses Methode kann ich ja nur anwenden wenn ich weiß wieviele Dimensionen ein Array hat oder?



Probier es doch aus, ich hab zwar die Dimensionen angegeben bei der Deklaration, aber bei der Ausgabe verwerte ich das ja nicht explizit, sondern lass die "Länge" des Arrays und der Zeilen (sozusagen) bestimmen.


----------



## TP (1. Feb 2005)

Beni hat gesagt.:
			
		

> P.S.  es geht auch einfacher:
> 
> ```
> int length = array.length;
> ```


ja danke, das kannte ich schon. ich hatte nur die hoffnung das mir die von mir benütze methode die dimension bringt und ich nur zu blöd war die doku zu verstehen 

mic_checker: was ich meine ist folgendes:


```
int[][][] testfeld = new int[4][3][8];
   
   System.out.println("Anzahl der Zeilen = "+testfeld.length);
   System.out.println("Anzahl der Spalten = "+testfeld[0].length);
```

Output:

Anzahl der Zeilen = 4
Anzahl der Spalten = 3

die dritte Dimension wird ja nicht abgefragt - woher auch? 

Worauf ich hinaus will ist: Man müsste das ganze doch rekrusiv per schleife solange durchlaufen lassen bis eine java.lang.ArrayIndexOutOfBoundsException Fehlermeldung kommt. Wenn ich nicht weiß wieviele Dimensionen das Array hat muss ich es ja irgendwie herausfinden. Meine Idee ist eben so, daß man abfragt ob 

testFeld[0]

existiert

dann ob 

testFeld[0][0]

existiert, dann ob

testFeld[0][0][0]

existiert, dann ob 

testFeld[0][0][0][0]

existiert usw -> bis eben die indexoutofbounds-exception kommt, dann weiß man doch, daß diese "tiefe" nicht mehr gibt oder? klar, eine absolute pfusch methode, aber ich habe keine andere idee wies sonst gehen soll wenn man die dimension des arrays nicht kennt.

verstehst du worauf ich hinaus will? 

ciao,
TP


----------



## Beni (1. Feb 2005)

Stell dir ein Array wie ein Buch vor (die Seiten sind die Elemente, die Seitenzahlen der Index).

Also: ein Buch = ein Array "String[] array"

Ein Büchergestellt ist eine Sammlung von Arrays: Büchergestellt = "String[][] array".

Nun müssen innerhalb eines Büchergestelltes aber nicht nur gleichgrosse Bücher stehen, sie können auch unterschiedliche Anzahl Seiten haben. Aber es wird garantiert kein Buch innerhalb eines Buches sein.

Bei deinem testfeld[][][] (sozusagen ein Raum voller Büchergestelle), weisst du bereits, dass es ein Array von Arrays von Arrays ist, du musst also nicht herausfinden wie tief diese Rekursion geht.

Wenn du z.B. alle Werte dieses testfeldes ausgeben willst, machst du das dann am einfachsten so:

```
int[][][] testfeld = ???

for( int i = 0; i < testfeld.length; i++ )  // Anzahl "Büchergestelle" abfragen
  for( int j = 0; j < testfeld[i].length; j++ )    // Anzahl "Bücher" im aktuellen "Gestell" abfragen
    for( int k = 0; k < testfeld[i][j].length; k++ )      // Anzahl "Seiten" im aktuellen "Buch" abfragen
      System.out.println( "Wert " + i + ", " + j + ", " + k " ist: " +testfeld[i][j][k]  );
```


----------



## mic_checker (1. Feb 2005)

TP hat gesagt.:
			
		

> verstehst du worauf ich hinaus will?



ja, aber schau dir mal Benis Beispiel an. 

Btw. ArrayIndexOutOfBoundsException als Abbruchkriterium einer rekursiven Methode halte ich persönlich nicht für allzu viel


----------



## TP (1. Feb 2005)

ich habe irgendwo einen knoten in meinem gehirn, mal schaun ob ich dne aufbekomme  danke für dein ausführliches posting beni!

mic_checker: hehe für mich ja auch nicht, deswegen rede ich ja von "pfusch" 

ciao
TP


----------

