# Mehrdimensionales dynamisches Array



## Nikolas (17. Aug 2007)

Hallo

Ich steige gerade von Pascal nach Java um und vermisse die schönen dynamischen Arrays, die es anscheinend hier nicht so ohne weiteres gibt. 
Als kleines Einstiegsprojekt habe ich mir Minesweeper ausgesucht, das bis schon ganz gut funktioniert, ausser, dass ich die Feldgröße nicht im Programm manipulieren kann, da ich bis jetzt mit arrays arbeite:

```
MineField[][] Field = new MineField[countX][countY];
```
wobei MineField eine eigene Klasse ist, die aus ein paar bools und integern besteht. 

Hierbei kann ich ganz schön über 
	
	
	
	





```
MineField[a][b].mined=true
```
 auf das array zugreifen, nur leider muss ich bei der initialisierung die Größe angeben. 

Auf der Suche nach einer anderen Möglichkeit bin ich auf den Vector gestoßen, der schon eher meine Sache zu sein scheint. Mit etwas suchen bin ich auch auf diesen Thread gestoßen, in dem gezeigt wird, wie ich vectoren in vectoren einbauen kann. 

Nur sieht das nicht gerade gut aus. Wenn ich ein Feld bearbeiten will, müsste ich erst den entsprechenden Vector aus dem ersten Vectir auslesen, denn dann casten und könnte dann mein Feld auslesen. 
Diese Aktion könnte ich zwar in eine kleine Funktion auslagern, aber schön ist das eigentlich nicht. 

Von da her ist meine Frage, ob es in Java eine andere Datenstruktur gibt, die ich per Feld_[j] ansprechen kann, die aber dynamisch ihre Länge ändern kann. 

Nikolas_


----------



## moormaster (17. Aug 2007)

Nikolas hat gesagt.:
			
		

> Nur sieht das nicht gerade gut aus. Wenn ich ein Feld bearbeiten will, müsste ich erst den entsprechenden Vector aus dem ersten Vectir auslesen, denn dann casten und könnte dann mein Feld auslesen.
> Diese Aktion könnte ich zwar in eine kleine Funktion auslagern, aber schön ist das eigentlich nicht.



Dank Generics entfällt dabei seit j2se 1.5 zumindest das Casten, wenn mans richtig macht.
http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html

So kann man dem Vector bei seiner Deklaration bereits den Typ der zu speichernden Objekte übergeben:


```
Vector<Integer> v = new Vector<Integer>();

 v.add(new Integer(3));
 v.add(new Integer(4));

 int test = v.get(0).intValue();
```

so kommt man völlig ohne Casten aus, da die get-Methode liefert gleich den richtigen Typ zurückliefert.
http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html

(nur so am Rande)
Dank Autoboxing vereinfacht sich obiges Beispiel sogar noch weiter, so dass man auch einfach int-Werte statt Integer-Objekten übergeben kann, welche dann automatisch in Integer-Objekte verpackt werden.

Das funktioniert auch in die andere Richtung: Versucht man ein Wrapper-Objekt direkt einer Variable primitiven Datentyps zuzuweisen, dann wird automatisch der jeweilige Wert des primitiven Typs zurückgegeben.



```
Vector<Integer> v = new Vector<Integer>();

 v.add(3); // speichert ein Integer-Objekt im Vector
 v.add(4);

 int test = v.get(0); // v.get(0) liefert immernoch Integer Objekte zurück, welche aber dank Autoboxing automatisch in
                            // primitive Werte umgewandelt werden, da diese einer int Variable zugewiesen werden sollen.
```



D.h. dein mehrdimensionales dynamisches Array wäre so ohne casten realisierbar:


```
Vector<Vector> rows = new Vector<Vector>();  // speichere Objekte vom Typ Vector

 rows.add(new Vector<MeinObj>()); // neue "Zeile" einfügen, welche Objekte vom Typ MeinObj speichern soll
 rows.get(0).add(new MeinObj("test")); // ein Objekt vom Typ MeinObj einfügen

 // rows.get(0) liefert jetzt direkt ein Objekt vom Typ Vector zurück, welches nicht extra gecastet werden muss
 // rows.get(0).get(0) liefert analog sofort ein Objekt vom Typ MeinObj
```


----------



## Beni (17. Aug 2007)

z.B. LinkedList und ArrayList, für deine Zwecke wäre letztere wohl die beste Wahl.

Um das Casten zu verhindern: benutze Generics.

```
List<List<Field>> grid = new ArrayList<List<Field>>();
grid.add( new ArrayList<Field>() );

...
grid.get( 0 ).add( new Field() );
...

Field xy = grid.get(x).get(y);
```

Wenn du dir eine Klasse "Grid" machst, die intern solche Listen verwendet, kannst du auch schönere Methoden (wie "get( x, y )") bauen.


----------



## Nikolas (18. Aug 2007)

Danke für die Hinweise, ich bin gerade dabei eine Klasse für die Listen zu bauen. So ganz verstehe ich die listen aber noch nicht, aber da mache ich lieber noch einen anderen Thread auf.


----------

