array vergrößern ohne vector oder list

Status
Nicht offen für weitere Antworten.

robthemobb

Mitglied
hallo zusammen,

ich glaube, dass hier ist der richtige ort für meine frage.
ich versuche gerade eine methode zu schreiben, welche mir ein gegebenes array vergrößert.

ich leg dazu ein zweites an mit feldlänge+1 und kopiere den inhalt brav. aber dann habe ich ja nun ein zweites array in dem mehr drin steht, aber mein ausgangs array ist ja immernoch starr und hat länge = feldlänge. wie bekomme ich denn den ganzen inhalt aus meinem ersatz array da rein?

ich will keinen code, nur mal ein paar denkanstöße!
grüße, rob
 
S

SlaterB

Gast
> wie bekomme ich denn den ganzen inhalt aus meinem ersatz array da rein?


eine Zeile vorher schreibst du
> und kopiere den inhalt brav

du hast also alles von Array A in das größere Array B kopiert,
dann macht die ungenau gestellte Frage keinen Sinn,
willst du nochmal alles von A nach B kopieren? hast du doch schon

oder willst du alles von B nach A kopieren?? geht gar nicht, passt ja nicht
und ist sowieso schon drin

A kannst du nicht vergrößeren, das bleibt für alle Zeiten so klein wie es ist
 

Marco13

Top Contributor
Um's nochmal deutlich zu sagen: Man kann die Größe eines Arrays nicht ändern. (Punkt.)

Man kann höchstens den Array durch einen größeren ersetzen. Dazu muss man aber wirklich alle Referenzen ersetzen, was hakelig sein kann, wenn man (unklugerweise) diese Referenzen "verteilt" über mehrere Klassen liegen hat.

Aber noch ein Beispiel, das vielleicht eine deiner Fragen beantwortet: Sowas....
Code:
void foo()
{
    int array[] = new int[123];

    resize(array, 456); // "Magische" Funktion

    System.out.println(array.length); // Soll "456" ausgeben
}
geht NICHT. (Nochmal: Punkt).

Höchstens sowas
Code:
void foo()
{
    int array[] = new int[123];

    array = createLargerArray(array, 456);

    System.out.println(array.length); // Kann "456" ausgeben
}
 

Siassei

Bekanntes Mitglied
Hallo,

arraycopy ist das große Zauberwort :wink:

Ein Beispiel mit int[] als PseudoCode
Code:
int[] quelle; // Gefülltes Ausgangs-Array
int[] add; // Elemente die hinzugefügt werden sollen
int[] result; // neues Array

result = new int[quelle.length + add.length];

// Kopiervorgang
System.arraycopy(quelle, 0, result, 0);
System.arraycopy(add, 0, result, quelle.length -1);

// Das Array "result" enthält nun alle Elemente als Copy.

Diese Mehtode wirt übrigends als nativ ausgeführt und ist normalerweise die schnellste in Java :wink:
 

robthemobb

Mitglied
Hi und danke für eure antworten.

Ich weiß bescheid über die Methode arraycopy. Es ging mir aber darum einfach mal selber zu probieren.

@SlaterB

ich hab mich blöd ausgedrückt. so wie du es gesagt hast, habe ich es gemacht. aber dann kann ich doch nur einmal vergrößern. nehmen wir mal an, es kommt ständig ein neues element dazu. dann muss ich doch ständig ein neues anlegen und ich kann mir bis jetzt nicht vorstellen wie ich den namenskonflikt löse (ich sehe da einen...)
 

Siassei

Bekanntes Mitglied
ich sehe auch keinen :wink:

In der Praxis wird das Array immer um eine bestimmte Anzahl von Elementen erweitert. Zudem gibt ein Counter den aktuellen letzten Eintrag an. Als Beispiel könntest du dir mal Hashtable ansehen.[/code]
 

Siassei

Bekanntes Mitglied
Achja, zur Optimierung könntest du eine Methode trim() mit einfügen. Diese kannst du von außen aufrufen, wenn du mit dem Hinzufügen fertig bist.
 

robthemobb

Mitglied
ok, ich versuchs mal als pseudocode...

Code:
int[] Array = new int[n];

int laenge = 0;

DO
{

int eingabe = function einlesen();

IF (Array.length()-1 > laenge)

THEN 
{
Array[laenge] = eingabe
laenge++
}

ELSE 
{
int[] TempArray = new int[laenge+1]
System.arraycopy(Array, 0, tempArray, 0, laenge);
Array[laenge+1] = eingabe
laenge++
}

}WHILE(eingabe != 0)

so hab ich mir das vorgestellt. mal davon abgesehen, dass mir recht schnell ne ArrayIndexOutOfBound Excption hinterhergeworfen wird, müsste ich doch nach jedem schleifendurchlauf ein neues array anlegen. dieses muss doch auch immer einen disjunkten namen haben, oder nicht?

habt ihr evtl noch ein paar denkanstöße für mich?

rob

ps. vielen dank für die anregungen
 
S

SlaterB

Gast
nein, braucht keinen disjunkten Namen, wieso sollte das so sein?

wenn du das Array vergrößern willst dann legst du neues tempArray an und kopierst das rüber,
das kannst du mehrmals machen, der Name 'tempArray' ist dann nicht verbraucht oder so,

da du anscheinend danach aber mit dem normalen Array weiterarbeitest,
musst du noch
array = tempArray;
schreiben

und ganz wichtig:
Variablen klein schreiben!

--------

es bietet sich an, bei zu wenig Platz das Array gleich um 50% oder 100% zu vergrößern statt nur um ein weiteres Feld,
so macht es auch ArrayList
 

robthemobb

Mitglied
ach fuck, natürlich, ich kopier nur die referenz. man, ich hab die ganze zeit gedacht ich kopiere die inhalte...
ich depp... danke.

ja, versuche mich schon an die conventions zu halten. habe auf papier angefangen array groß zu schreiben und das übernommen.

ich werd mich gleich nochmal an den code setzen...

rob
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben