SEK Geschrieben 18. November 2009 Teilen Geschrieben 18. November 2009 Hallo, ich wollte eine Klasse schreiben, die beliebige Objekte aufnehmen kann. Wollte sie ändern mit einer ArrayList implementieren. Problem ist allerdings, dass wohl die ich im Konstruktor in der "for-Schleife" als Spalte erzeuge, in der Methode "add" nicht mehr kennt. (Sind wohl vom garbage collector aufgelesen worden). Wenn ich nämlich versuche in einer anderen Klasse (im selben Paket) Matrix kostenmatrix = new Matrix(2,2); kostenmatrix.add(0,1,new Integer(3)); auszuführen krieg ich diese Exception: Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0 at java.util.ArrayList.add(Unknown Source) Hier ist der Code: import java.util.ArrayList; import java.util.Iterator; public class Matrix { private int zeilenanzahl; private int spaltenanzahl; private ArrayList zeilen; public Matrix(int zeilenanzahl, int spaltenanzahl){ this.zeilenanzahl = zeilenanzahl; this.spaltenanzahl = spaltenanzahl; zeilen = new ArrayList(zeilenanzahl); for (int i=0; i<spaltenanzahl; i++){ zeilen.add(i,new ArrayList(spaltenanzahl)); } } public void add(int zeilenposition, int spaltenposition, Object o){ ArrayList spalten = (ArrayList)zeilen.get(zeilenposition); spalten.add(spaltenposition,o); } public Object get(int zeilenposition, int spaltenposition){ ArrayList spalten = (ArrayList)zeilen.get(zeilenposition); return spalten.get(spaltenposition); } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 18. November 2009 Teilen Geschrieben 18. November 2009 Als erstes gleich, das nächste mal bitte die Code-Tags benutzen, dann ist der Quelltext um einiges einfacher lesbar. Und dann zu deinem Quelltext. Du scheinst den Konstruktor der ArrayList etwas missverstanden zu haben, wenn du dem Konstruktor einen int-Wert übergibst, dann legt er dir eine leere ArrayList mit dieser Kapazität an, dass heißt bis zu diesem Wert kann er Objekte hinzufügen ohne sein internes Array erweitern zu müssen, trotzdem ist die ArrayList noch immer leer, wodurch du eine IndexOutOfBoundsException bekommst, sobald du versuchst dort auf die Werte zuzugreifen. In deinem Fall zum Beispiel ist beim Aufruf deiner Methode add() die ArrayList spalten noch immer leer. In dem Fall kannst du aber an Index 1 keinen Wert hinzufügen, wenn Index 0 noch nicht belegt ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SEK Geschrieben 18. November 2009 Autor Teilen Geschrieben 18. November 2009 achso, d.h ich kann die ArrayList nur von "vorne" nach hinten füllen? Also ich kann keinen Eintrag an der Position 1 erstellen obwohl noch keiner an Position 0 ist? Ich dachte halt, dadurch, dass ich im Konstruktor der Klasse Matrix schon jeweils die leeren ArrayLists in der variable/attribut zeilen zeilen.add(i,new ArrayList(spaltenanzahl)); hinzugefügt habe müsste es gehen. Diese Variable "spalten" ist eigentlich nur so eine Art Hilfskonstrukt. Eigentlich würde ich lieber zeilen.get(zeilenposition).add(spaltenposition,o) machen, aber da jammert er, weil ja scheinbar nicht weiß, dass zeilen.get() eine ArrayList enthält und somit die Methode add() definiert ist. Mit generics (womit man das vielleicht lösen könnte?) kenn ich mich ehrlich gesagt nicht wirklich aus. Wäre auch für eine alternative Möglichkeit die Methode add bzw. im wesentlichen die KLasse Matrix zu schreiben offen, falls ihr irgendwelche genialen Einfälle habt. Danke schon mal! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 19. November 2009 Teilen Geschrieben 19. November 2009 Genau so ist es. Du kannst das ganze aber auch einfach mit Arrays lösen. Wenn von vornherein eh klar ist, dass die Matrix nur eine bestimmte Anzahl von Spalten und Zeilen hat, dann kannst du einfach im Konstruktor deine Arrays auf die übergebenen Werte initialisieren. Dann hast du auch kein Problem mehr, wenn du an einer bestimmten Stelle einen Wert hinzufügen willst, das würde dann gehen. Und zu deinem anderem Problem, ja das würde sich mit Generics lösen lassen. Das würde wie folgt aussehen bei der Erzeugung der ArrayListen: private ArrayList[B]<ArrayList<Integer>>[/B]; [...] zeilen = new ArrayList[B]<ArrayList<Integer>>[/B](zeilenanzahl); for (int i=0; i<spaltenanzahl; i++){ zeilen.add(i,new ArrayList[B]<Integer>[/B](spaltenanzahl)); } Das heißt du gibst deiner ArrayList gleich bekannt was für Objekte es speichern wird, das heißt aber auch, du kannst dann dort wirklich nur solche Objekte speichern. Im Fall deiner Spalten-ArrayList heißt das <Integer> dann also dass diese ArrayList Integer Objekte speichern wird. Die Zeilen-ArrayList sieht zwar etwas komplizierte aus, sagt aber einfach nur aus, dass diese ArrayList selber Objekte einer ArrayList speichert welche Integer Objekte speichert. Dann bekommst über die get() Methode auch gleich die richtigen Objekte zurück, und musst nicht erstmal casten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
speedi Geschrieben 19. November 2009 Teilen Geschrieben 19. November 2009 Wenn du deine ArrayList nicht von vorne nach hinten willst und die größe die du brauchst vorher schon kennst, dann verwende doch anstelle der ArrayList einfach ein Array. Alles andere wäre in dem Fall wahrscheinlich langsamer und würde zudem mehr Speicherplatz belegen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SEK Geschrieben 19. November 2009 Autor Teilen Geschrieben 19. November 2009 (bearbeitet) Nein, der Grund warum ich kein Array verwenden möchte ist, dass ich die Matrix zur Laufzeit verändern möchte, d.h Spalten bzw. Zeilen löschen möchte. Schön wärs natürlich auch, wenn ich einen zweiten Konstruktor schreiben könnte, dem ich nicht die spalten bzw. zeilenanzahl übergeben muss, der dann erst mal eine leere 10x10 Matrix erstellt. Aber wie könnte ich das Problem denn am geschicksten lösen, dass ich Objekte an beliebiger Stelle einfüge? Soll ich etwa die Matrix bzw. die ArrayList bei der Intialisierung mit "dummy objekten" befüllen?! Bearbeitet 19. November 2009 von SEK Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 19. November 2009 Teilen Geschrieben 19. November 2009 Kannst du doch, da du nun weißt, dass die ArrayList eh von vorne herein keine maximale Größe hat, und ja auch dynamisch wächst. Dann musst du vielleicht nur intern kontrollieren, wenn jemand auf deine Matrix zugreift, ob der Aufruf innerhalb der Matrix liegt, die du bisher erstellt hast, ab nun durch direkte Werte im Konstruktor, oder einen 10x10 Matrix weil nichts übergeben wurde, oder anderen Werten weil zwischendurch Spalten oder Zeilen hinzugefügt wurden. Du kaannst in den ArrayListen auch erstmal die Werte mit null besetzen, dann dürfte das Problem mit dem add() an einer Position wo davor noch keine Werte eingetragen sind, auch nicht auftrefen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SEK Geschrieben 19. November 2009 Autor Teilen Geschrieben 19. November 2009 okay, klappt jetzt alles soweit. Danke für eure Hilfe insbesondere von dir Dragon8! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.