Array immer wieder um ein Element erweitern

Hallo zusammen!

Ich möchte innerhalb einer Klasse ein Array anlegen. Dieses Array soll dann immer wieder um ein Element vergrößert werden. Ich habe mir folgendes überlegt:

Java:
public class UebungenArray{
   private int[] array;
   ....
   public void arrayErweitern(int pZahl){
     int zahl = pZahl;
     int[] temp = new int[array.length+1];
     for (int i=0; i<array.length; i++){
         temp[i] = array[i];
     }
     temp[array.length] = zahl;
     array = temp;
   }
}

Es funktioniert so. Spricht irgendwas gegen die programmierte Methode? Würde es einfacher gehen?
 
Dagegen spricht erstmal nichts. Für so welche Aufgaben gibts immer tausend verschiedene Wege 😉
Deine for-Schleife zum Umkopieren könnte man z.B ersetzen durch:
Java:
System.arraycopy(array, 0, tmp, 0, array.length);

Bzw. Arrays.copyOf nutzen:
Java:
    public void arrayErweitern(int pZahl) {
        array = Arrays.copyOf(array, array.length + 1);
        array[array.length - 1] = pZahl;
    }

Oder mit Streams:
Java:
    public void arrayErweitern(int pZahl) {
        array = IntStream.concat(IntStream.of(array), IntStream.of(pZahl)).toArray();
    }

Aber das ist immer Geschmacksfrage, deine Lösung ist schon ganz gut 😉
 
Es funktioniert so. Spricht irgendwas gegen die programmierte Methode? Würde es einfacher gehen?

Das einzige, dass dagegen spricht wäre die Laufzeit. Du musst jedes Mal alle Elemente durchgehen, um ein einziges Element hinzuzufügen.
Da die Klasse "UebungenArray" weiß ich nicht für was du übst. Falls es Übungen im Hinblick auf Schule/Uni sind und ihr solche Methode implementieren müsst, dann ist das in Ordnung.
Falls du privat übst und generell wissen willst, wie man das normalerweise macht:
Man verdoppelt die Größe des Arrays. Dann hat man nämlich amortisiert konstante Laufzeit für das Einfügen einen Elementes.
Zudem: Diese Idee wurde bereits in der Standard-Lib. umgesetzt: Die ArrayList macht genau das unter der Haube.
 
Ok. Schon mal vielen Dank. Ich übe für mich 🙂…

Ich möchte aber ungern ArrayList einführen. Und ich würde die Methode zum Anfügen eines Elements auch gerne selber schreiben ohne auf Anderes zurückzugreifen.
 
Es wurde schon fast alles geschrieben, nur eines noch:
int zahl = pZahl; ist überflüssig, denn du kannst am Ende direkt temp[array.length] = pZahl; schreiben.
 
Was bedeutet amortisiert konstante Laufzeit?
Muss dann nicht auch in ArrayList eine Methode hinterlegt sein, mit der man ein Element hinzufügt? Weißt du wie die Methode abläuft?
 
Was bedeutet amortisiert konstante Laufzeit?
Muss dann nicht auch in ArrayList eine Methode hinterlegt sein, mit der man ein Element hinzufügt? Weißt du wie die Methode abläuft?
Es wird zusätzlich gespeichert wie viele Elemente in der Liste vorhanden sind. Wenn der der Platz im Array nicht ausreicht wird die Arraygröße verdoppelt und das Element hinzugefügt. Sollte nun ein weiteres Element hinzugefügt werden ist ja schon Platz im Array. Es wird abgespeichert und die Anzahl der Elemente in der Liste erhöht. D.h. "jede Zweierpotenz" = logarithmisch benötigt man für eine Einfügeoperation lineare Laufzeit, alle Einfügeops dazwischen sind konstant. Das ergibt bei dieser Konstellation durchschnittlich = amortisiert konstante Laufzeit.
 

Neue Themen


Zurück
Oben