Zum Inhalt springen

Matrix mit Objekten erstellen


Empfohlene Beiträge

Geschrieben

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

}

}

Geschrieben

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.

Geschrieben

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! ;)

Geschrieben

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.

Geschrieben

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.

Geschrieben (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 von SEK
Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...