Hi, ich habe eine Frage und zwar wie kann man beim Erzeugen eines Arrays im Konstruktor die Array-Länge ändern? Also nicht array = new Array [3] sondern, dass man die 3 beim Erzeugen des Arrays ändern kann?
Allgemein kannst du eine Variable für die Erzeugung des Arrays verwenden. Wo der Wert darin herkommt ist egal, das kann eine stinknormale Variable sein, der du einen Wert zuweist oder der Parameter einer Methode oder auch der Rückgabewert einer anderen Methode.
Java:
int[] arr =newint[getSize()];// wir unterstellen mal die Existenz der Methode getSize()...
Naja ist zwar nicht das effizienteste aber du könntest eine Methode erstellen, welche ein neues Array deiner gewollten Größe erstellt und alle Elemente aus dem alten Array in das neue copieren
Hi, ich habe eine Frage und zwar wie kann man beim Erzeugen eines Arrays im Konstruktor die Array-Länge ändern? Also nicht array = new Array [3] sondern, dass man die 3 beim Erzeugen des Arrays ändern kann?
ich hätte gesagt, indem du als attribut in der klasse int[] array; ganz oben stehen hast.
vorausgesetzt deine klasse kriegt ein int n übergeben als parameter bei der objekterzeugung (aka int n ist der parameter vom konstruktor)
dann würde ich in den konstruktor einfahc ne zeile
array=new int[n]; packen.
bewirkt dass wenn du ein objekt der klasse erzeugst, dieses dann ein attribut array hat was ein int array der länge n ist.
Ansonsten eine shcon vorgegebene länge wieder verändern geht nicht.
müsstest du die variable einem neuen, größeren array zuweisen und ggbfls die wette aus dem lten kleinen array da reinkopieren
Naja ist zwar nicht das effizienteste aber du könntest eine Methode erstellen, welche ein neues Array deiner gewollten Größe erstellt und alle Elemente aus dem alten Array in das neue copieren
Tatsächlich ist das die einzige Möglichkeit.
Arraylist#add macht das intern auch so ähnlich.
Ist das Array zu kurz, wird ein neues - größeres - erstellt, die alten Werte werden reinkopiert, dann der neue.
@ OP
Falls du wirklich auf Teufel Komm raus mit Arrays arbeiten willst (warum keine Listen, die sind doch so viel angenehmer?), dann schau dir diese Methode an:
Naja aber die erweitert meist um mehr als nur eine Stelle und diese Operation nicht zu oft durchzuführen, dass sie sehr Laufzeitintensiv ist bei großen ArrayLists
Naja aber die erweitert meist um mehr als nur eine Stelle und diese Operation nicht zu oft durchzuführen, dass sie sehr Laufzeitintensiv ist bei großen ArrayLists
ArrayList<String> s =newArrayList<>(2);
s.add("A");
s.add("B");
s.add("C");
Am Ende wird elementData eine Größe von 3 haben.
Initialisiert man ArrayList ohne Parameter, hat Elementdata eine Größe von 10 und wird bei Bedarf um 1 erweitert (bei addAll(...) wird natürlich sofort um die notwendige Anzahl erweitert).
Deshalb: ArrayLists nach Möglichkeit immer mit der geschätzten Maximalgröße initialisieren oder per ensureCapacity nachträglich auf die gewünschte Größe setzen.
privatevoidgrow(int minCapacity){// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity +(oldCapacity >>1);if(newCapacity - minCapacity <0)
newCapacity = minCapacity;if(newCapacity - MAX_ARRAY_SIZE >0)
newCapacity =hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:
elementData =Arrays.copyOf(elementData, newCapacity);}
==> Es wird immer mindestens um 50% erweitert ) oldCapacity >> 1 ist oldCapacity / 2
Ja, ich würde da auch kein wirkliches Kosten/Nutzen Verhalten sehen, hier Abweichungen vom OpenJDK einzuführen. Zumal da in den Kommentaren der Klasse ganz deutlich steht:
* Each {@code ArrayList} instance has a capacity. The capacity is
* the size of the array used to store the elements in the list. It is always
* at least as large as the list size. As elements are added to an ArrayList,
* its capacity grows automatically. The details of the growth policy are not
* specified beyond the fact that adding an element has constant amortized
* time cost.
Ich habe @Neumi5694 so verstanden, dass er an den Code über den Debugger gekommen ist, d.h. er hat wirklich seine add Aufrufe verfolgt.
Das habe ich auch einmal nachgespielt (Wer weiss, was ich da sonst an Code finde in irgendwelchen Repositories ) und ich kann das auch bestätigen. Er läuft in das grow() rein was dann eben genau dieses grow(size + 1) aufruft.
Der Code mit den +50% ist auch gar nicht mehr enthalten was ich so gesehen habe.
ist damit natürlich kompletter Quatsch. Der Code ist natürlich so enthalten wie Du ihn auch korrekt kopiert hast und ich war schlicht blind. (Will jemand frische Tomaten? Ganz frisch von meinen Augen gepflückt - bezüglich Sprichwort: Tomaten auf den Augen haben )
privatevoidgrow(int minCapacity){// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity +(oldCapacity >>1);if(newCapacity - minCapacity <0)
newCapacity = minCapacity;if(newCapacity - MAX_ARRAY_SIZE >0)
newCapacity =hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:
elementData =Arrays.copyOf(elementData, newCapacity);}
==> Es wird immer mindestens um 50% erweitert ) oldCapacity >> 1 ist oldCapacity / 2
Wann wurde das denn geändert?
Wie war die ganze Zeit felsenfest der Überzeugung, das mit den +50% Kapazität wäre das aktuelle.
und nicht das lächerliche Erweitern um eine(!) Stelle! :O
Wann wurde das denn geändert?
Wie war die ganze Zeit felsenfest der Überzeugung, das mit den +50% Kapazität wäre das aktuelle.
und nicht das lächerliche Erweitern um eine(!) Stelle! :O