Ich arbeite an einem Projekt, aber ich kann keine vorhandenen Java-Datenstrukturen (zB ArrayList, Bäume, usw.) verwenden
Ich kann nur Arrays verwenden. Daher muss ich ein Array dynamisch mit neuem Speicher aktualisieren.
Ich lese aus einer Textdatei und ich reserviere 100 für den Speicher des Arrays:
%Vor%Das funktioniert jetzt für weniger als 100 Listenelemente. br.readline ist der gepufferte Leser, der jede Zeile einer Textdatei durchläuft. Ich habe es dann jedes Wort in Liste speichern und dann meinen Index (WordCount) erhöhen.
Sobald ich jedoch eine Textdatei mit mehr als 100 Elementen habe, erhalte ich einen Zuordnungsfehler.
Wie kann ich dieses Array dynamisch aktualisieren (und dadurch das Rad neu erfinden)?
Danke!
Sie ordnen ein neues Array zu (z. B. die doppelte Kapazität) und verschieben alle Elemente dorthin.
Im Grunde müssen Sie überprüfen, ob wordCount
den wordList.size()
trifft, wenn dies der Fall ist, erstellen Sie ein neues Array mit der doppelten Länge des vorherigen und kopieren Sie alle Elemente dorthin (erstellen Sie eine Hilfsmethode) um dies zu tun) und weisen Sie wordList
Ihrem neuen Array zu.
Um den Inhalt zu kopieren, könnten Sie >% System.arraycopy
verwenden, aber ich bin mir nicht sicher, ob das mit Ihren Einschränkungen erlaubt ist. Sie können die Elemente einfach nacheinander kopieren:
Fortfahren.
Sehen Sie sich die Implementierung von Java ArrayList . Java ArrayList
verwendet intern ein Array fester Größe und weist das Array neu zu, sobald die Anzahl der Elemente die aktuelle Größe überschreitet. Sie können auch in ähnlichen Zeilen implementieren.
Sie können die Array-Größe nicht dynamisch erhöhen, besser, wenn Sie in das neue array
kopieren. Verwenden Sie dazu System.arrayCopy
, besser als jedes Element in ein neues Array zu kopieren. Als Referenz
Warum ist System.arraycopy in Java nativ? .
Sie müssen manuell ein neues größeres Array erstellen und die Elemente kopieren.
das kann helfen
Nehmen wir einen Fall, wenn Sie ein Array mit 1 Element haben, und Sie möchten die Größe erweitern, um 1 Million Elemente dynamisch unterzubringen.
Fall 1:
%Vor%Fall 2 (zunehmende Größe um einen Additionsfaktor):
%Vor%Fall 3 (zunehmende Größe um einen Multiplikationsfaktor):
%Vor%Wenn Sie die Größe eines Arrays dynamisch mit Array.copy erweitern oder über das Array iterieren und die Elemente mithilfe der for-Schleife in ein neues Array kopieren, iteriert es tatsächlich über jedes Element des Arrays. Dies ist eine kostspielige Operation. Array.copy wäre sauber und optimiert, immer noch teuer. Also würde ich vorschlagen, die Array-Länge um einen Multiplikationsfaktor zu erhöhen.
Wie es hilft, ist
Im Fall 1, um 1 Million Elemente unterzubringen, müssen Sie die Größe des Arrays 1 Million - 1 mal, d. h. 999 999 mal, erhöhen.
In Fall 2 müssen Sie die Größe des Arrays 1 Million / 10 - 1 mal erhöhen, d. h. 99,999 mal.
In Fall 3 müssen Sie die Größe des Arrays um log 2 <1 Million - 1 mal erhöhen, d. h. 18,9 (hypothetisch).
Tags und Links java arrays word-count