Array Eintrag löschen?

Hallo,
wahrscheinlich zwei einfache Fragen mit einfachen Antworten:

Ich habe folgende Deklaration:
double[][] Testmatrix;

Die Anzahl der Zeilen sind dynamisch zur Laufzeit, die Spaltenzahl steht fest (Also z.B.: [x][2]).

Eine Bespielfüllung könnte folgendermaßen aussehen:

[1.0][2.0]
[3.0][4.0]
[5.0][6.0]
[7.0][8.0]

  1. Frage: Wie kann ich während der Laufzeit eine beliebige Zeile killen?
    Das Ergebnis sollte hinterher so aussehen:

Pseudocode: ‚Kill Testmatrix[1]‘ ==>
[1.0][2.0]
[5.0][6.0]
[7.0][8.0]
Die folgenden Zeilen sollen also nachrutschen,
so dass aus dem [4][2]-Array ein [3][2]-Array wird.

  1. Frage:
    Wie kann ich zur Laufzeit eine beliebige zeile wieder anhängen, so dass ich ein [5][2]-Array erhalte, dass wie folgt aussehen könnte:

Pseudo-Code: ‚Append Testmatrix[][] = 9.0, 10.0‘
[1.0][2.0]
[3.0][4.0]
[5.0][6.0]
[7.0][8.0]
[9.0][10.0]

Kann ich einfach eine Zeile dranhängen mit
Testmatrix[Testmatrix.length+1][0]=9.0;
Testmatrix[Testmatrix.length+1][1]=10.0;
oder gibt es einen anderen (besseren) Weg?

Für die Antworten ein großes DANKE im Voraus!

Gruß
Oliver

Hallo Oliver.

Arrays sind statische Listen. Ihre Länge läßt sich nach der Initialisierung nicht mehr ohne weiteres ändern.

Daher mein Vorschlag:

Verwende doch eine ArrayList. Die ist von der Länge her flexible und lässt sich ohne Probleme ändern.
Wenn du Java 5 verwendest kannst du sie auch typisieren:

 ArrayList testmatrix = new ArrayList();
 // Anhängen eines neuen Eintrags
 testmatrix.add(new Double[] {2.0, 9.0});
 // Löschen des 3. Eintrags
 testmatrix.remove(2);

Hoffe, das hilft fürn Anfang.

Viel Erfolg noch,
Chris

Danke! Super Idee!
Hi Chris!

Danke für deinen Vorschlag. Das ist genau das, was ich gesucht habe!

Ich habe aber noch einmal eine Frage zur Methode ‚trimToSize()‘:
Das Prinzip habe ich so verstanden, dass nach einem Remove der Listenplatz leer bleibt. Nach
testmatrix.remove(2);
ist der 3. Listenplatz also nicht mehr befüllt. Mit dem Befehl trimToSize() wird die Liste aber wieder zurechtgerückt, so dass alle nachfolgenden Plätze quasi „hochrutschen“. Ist das richtig gedeutet?
Das heißt doch, dass nach jedem Remove ein trimToSize folgen müsste!?

Gruß
Oliver

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo.

Ich habe aber noch einmal eine Frage zur Methode
‚trimToSize()‘:
Das Prinzip habe ich so verstanden, dass nach einem Remove der
Listenplatz leer bleibt. Nach
testmatrix.remove(2);
ist der 3. Listenplatz also nicht mehr befüllt. Mit dem Befehl
trimToSize() wird die Liste aber wieder zurechtgerückt, so
dass alle nachfolgenden Plätze quasi „hochrutschen“. Ist das
richtig gedeutet?

Nein.

Das heißt doch, dass nach jedem Remove ein trimToSize folgen
müsste!?

Die ArrayList belegt unter Umständen mehr Speicher, als für die gerade gespeicherten Elemente nötig ist. trimToSize() gibt den überzähligen Speicher frei. Beim nächsten hinzufügen eines Elemtes müsste dann wieder Speicher besorgt werden. Der überzählige Speicher ist beim Zugriff aber nicht relevant, dass heißt, du bemerkst davon nichts - naja, außer du legst irgendwo noch haufenweise andere Objekte an, so dass der Speicher ausgeht.
Wenn beim Hinzufügen eines Elementes der Speicher nicht reicht und weiterer Speicher für die ArrayList zur Verfügung gestellt wird, so ist das auch in der Regel mehr als für ein Element benötigt wird, der übrige Speicher ist sozusagen als Reserve für spätere Hinzufügungen.
Löscht du ein Element, so wird auch nicht unbedingt der Speicher wieder freigegeben, sondern halt auch als Reserve behalten. Die hinteren Elemente „rutschen“ aber nach vorne, so dass der Index keine Lücken aufweist.

Sebastian.