Skip to forum
Benachrichtigungen
Alles löschen

Java Array-"Vergrößerung"

12 Beiträge
8 Benutzer
0 Reactions
1,431 Ansichten
Floppy83
Joined: 10.09.2006

Folgende Java Methode, soll das gegebene Array vergrößern (immer verdoppeln), also zumindest scheinbar. Aber anscheinend funktioniert die Methode nicht, was hab ich falsch gemacht?

Jemand Ideen?

Danke im Vorraus

private void expand() {

int alteGrenze = size;

size = size * 2;

WordElement[] copytable = new WordElement;

for (int i = 0; i < alteGrenze; i++) {

copytable = table;

}

WordElement[] table = new WordElement;

for (int i = 0; i < alteGrenze; i++) {

table = copytable;

}

}

zur Ergänzung:

size und table[] sind Variablen der Klasse WordTable, zu der auch diese Methode expand() gehört. size ist vom typ integer und table[] ist ein objekt von der Klasse WordElement und als array deklariert.

Vor der zweiten for-Schleife erstell ich nochmal das Objekt table[], wird damit mein gegebenes table[] objekt überschrieben oder darf ich das nicht tun? Der Compiler merkert nicht.


Antwort
Zitat
11 replies
Django3
Joined: 16.10.2009

Ich würde es zumindest anders machen... keine Ahnung ob da ein Unterschied besteht:

WordElement[] table = new WordElement[size];

würde ich durch

table = new WordElement[size];

ersetzen. Die Variable table besteht ja bereits und muss nicht neu erstellt werden. Sie muss nur mit einem neuen Objekt verknüpft werden.


Antwort
Zitat
fatt
Joined: 27.10.2006

Warum benutzt du nicht einfach eine ArrayList?


Antwort
Zitat
FiftyBlume
Joined: 06.06.2010

In der Annahme, dass table[] eine Variable innerhalb der Klasse ist:

Django liegt mit seiner Vermutung richtig, WordElement[] table legt eine lokale Variable an, die anschließend verändert wird.


Antwort
Zitat

Das was du da hast wird niemals funktionieren, hast du noch anderen Code?
Löst ne Arraylist dein Problem nicht oder muss es so gemacht werden?

pack mal alles auf pastebin, dann kann man es besser lesen...


Antwort
Zitat
woodstock81
Joined: 07.07.2006

Was heißt denn das "wird niemals funktionieren"? Die alten Elemente einzeln rüberzukopieren ist doch gar nicht mal so doof. Ich glaube, man kann sogar das alte Array dann komplett mit dem neuen überschreiben:

table=copytable;

(also nicht Elementenweise)

Dass das mit ner Neudeklaration dann weg ist, wurde ja schon gesagt.


Antwort
Zitat
philwen
Joined: 13.05.2007

warum 2 mal ne for-schleife?

private void expand(){
WordElement[] newArray = new WordElement[table.Length*2];

for(int i = 0; i<table.Length;i++){
newArray = table;

}

table = newArray;

}

PS: hab dne code hier geschrieben - also bitte nicht wegen syntaxfehler beschweren ;)


Antwort
Zitat
sarc
Joined: 06.06.2008

Ich nehme an, das ist ne Übungsaufgabe. In der Praxis wird natürlich jeder ArrayList nutzen (das intern mehr oder weniger das gleiche tut...).

Ansonsten unbedingt den Tipp von philwen umsetzen, das spart doch einiges an Rechenaufwand. Zu Übungszwecken darfst du aber mal überlegen, warum das so ist und warum das funktioniert. :)

Und wenn du protzen willst, dann schau dir mal System.arraycopy an... ;)


Antwort
Zitat
Floppy83
Joined: 10.09.2006

Jo danke für die Antworten!!

Ich hab auch schon gegoogelt, aber da es halt ne Aufgabe ist, die ich bestehen muss, gibt es halt Auflagen und somit fällt Arraylist und arraycopy etc. pp leider weg.

Ich bekomme es jetzt glaube ich einigermaßen hin, mein größtes Problem ist halt nur noch, dass hinterher alles wieder in meinem Ursprungsobjekt table[] stehen muss. Wir haben halt ne API als Vorgabe und da steht halt unter anderem --> WordElement[] table. Es reicht also nicht wenn ich ein neues größeres Array erschaffe und alles dort reinkopiere, da ich mit meinem table[] objekt weiter arbeiten muss, deswegen auch der neue Konstruktor Aufruf.

--> Wordelement[] table = new WordElement[size]

Das ist aber falsch weil ich ja nochmal ein Platz für die Variable table reserviere und das ist überflüssig oder?

Dementsprechend reicht auch --> table = new WordElement[size] ???

Wie schon gesagt ist mein Problem die API und dort darf halt kein neues Objekt von der Klasse WordElement auftauchen, denn sonst

--> meine API != vorgegebene API

Ja wie ihr merkt bin ich noch ziemlich am Anfang der Java Geschichte :-)


Antwort
Zitat
sarc
Joined: 06.06.2008

Warum probierst du nicht einfach das was philwen vorgeschlagen hat? ;)


Antwort
Zitat
FiftyBlume
Joined: 06.06.2010

okay, nochmal:

Wordelement[] table =

und

table =

beziehen sich auf unterschiedliche Variablen - die erste Version erzeugt eine Variable, die nur lokal in der Methode verfügbar ist(wie copytable) und entsprechend änderst du natürlich auch nicht die globale Variable table. Was du machst ist eine neue Variable zu deklarieren, lass das weg, dann sollte das passen.


Antwort
Zitat
Floppy83
Joined: 10.09.2006

Jo okay, danke an alle!!

Stand wohl zum Schluss ein wenig auf dem Schlauch, aber bin ja auch noch nicht lange im Stoff.

Also nochmal Danke und kann dann zu hier.


Antwort
Zitat