Wie können wir ein Array dynamisch zuweisen und erweitern?

7

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!

    
Zack Tanner 12.02.2013, 16:29
quelle

8 Antworten

16

Sie können so etwas tun:

%Vor%

Die Verwendung von java.util.Arrays.copyOf(String[]) macht grundsätzlich dasselbe wie:

%Vor%

außer es ist eine Zeile Code statt drei. :)

    
Ted Hopp 12.02.2013, 16:34
quelle
4

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:

%Vor%

Fortfahren.

    
pcalcao 12.02.2013 16:31
quelle
3

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.

    
ManojGumber 12.02.2013 16:35
quelle
2

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? .

%Vor%     
Subhrajyoti Majumder 12.02.2013 16:33
quelle
0

Sie müssen manuell ein neues größeres Array erstellen und die Elemente kopieren.

das kann helfen

    
Massimiliano Peluso 12.02.2013 16:33
quelle
0

Visual Basic hat eine nette Funktion: ReDim Preserve .

Jemand hat freundlicherweise eine gleichwertige Funktion geschrieben - Sie finden hier . Ich denke, es tut genau das, wonach du verlangst (und du erfindest das Rad nicht neu - du kopierst eines anderen) ...

    
Floris 12.02.2013 16:34
quelle
0

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).

    
Ashwin Aggarwal 10.02.2016 16:05
quelle
0
%Vor%

Ausgabe für den obigen Code ist:

1 2 3

1 2 3 4 5

    
Aitha Ranjeeth 15.09.2017 14:23
quelle

Tags und Links