Länge eines Arrays ändern

cuchulainn

Mitglied
Hallo,

ich soll eine Klasse programmieren, die bestimmte Funktionen für Arrays anbietet. Unter anderem gibt es die Funktion, die Länge des Arrays zu ändern.
Die Klasse hat ein int-Feld namens "feld" einer vorgegebenen Länge als Attribut. Wenn der Benutzer die Funktion "neueDimension" aufruft, kann er eine neue Länge eingeben, und die Länge des Attributs wird auf diese Länge gesetzt.
Ich habe mir das ganze folgendermaßen überlegt: Ich kopiere die Werte aus "feld" in ein Puffer-Array. Dann erstelle ich ein neues Feld namens "feld" mit der neuen Länge und kopiere die Werte wieder hinein. Mein Problem ist nun, dass ich das Array mit der alten Länge nicht freigeben kann.
Mein Quelltext sieht folgendermaßen aus:

Code:
    // feld ist das Attribut der Klasse
    public void neueDimension(int d) {
        // Pufferfeld anlegen
        int [] puffer = new int[feld.length];
        // Pufferfeld mit den Daten füllen
        for (int i = 0; i <= feld.length - 1; i++) {
            puffer[i] = feld[i];
        }
        // Feld mit neuer Dimension erstellen. Hier müsste ich das alte Feld freigeben
        int [] feld = new int[d];
        // Neues Feld mit Daten füllen
        for (int i = 0; i <= feld.length - 1; i++) {
            feld[i] = puffer[i];    
        }
    }

Ich hoffe, ich konnte das Problem verständlich machen. So viel ich weiß gibt es in Java keine Möglichkeit, ein Objekt freizugeben wie in C++ oder Delphi (mit den Sprachen habe ich vorher gearbeitet). Kann mir jemand helfen?

Gruß

Cuchulainn
 
Hi,

bist schon fast richtig, die Idee mit dem Puffer is genau richtig..

Code:
// Feld mit neuer Dimension erstellen. Hier müsste ich das alte Feld freigeben
        [- int [] -] feld = new int[d];
        // Neues Feld mit Daten füllen
        for (int i = 0; i <= feld.length - 1; i++) {
            feld[i] = puffer[i];

Hier erzeugst Du eine neue, zweite "feld"-Variable, und zwar lokal innerhalb des Klassenscopes.
Wenn Du einfach die int[] - Deklaration weglässt, dann weisst Du Deiner "richtigen" feld-variable ein neues Array zu.

Genau das ist auch der Weg, n Objekt in Java wegzublasen:
Nimm die letzte Referenz darauf weg, dann wird es entsorgt (vgl. Garbage Collection)

hoffe, konnte helfen..

PS:
Die Geschichte mit dem Pufferarray ist noch optimierbar, indem Du kein neues anlegst sondern n zweiten Pointer auf das alte Array legst und dann rüberschiebst.

z.B.
Code:
int [] puffer = feld;
 
Hallo!

Ich würde dir empfehlen Arrays immer mit System.arraycopy(....) zu kopieren. Das geht schneller als von "Hand" drüber zu iterieren.

Gruß Tom
 
Hallo,

@Winnetoupopper: Vielen Dank. So funktioniert es einwandfrei.

@Thomas Darimont: Gruß von einem Saarländer an einen anderen ;)
An arraycopy habe ich nicht gedacht. Ich habe es eingebaut. Vielen Dank für den Tipp.
 
Zurück