# array vergrößern ohne vector oder list



## robthemobb (11. Aug 2008)

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


----------



## SlaterB (11. Aug 2008)

> 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 (11. Aug 2008)

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

```
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

```
void foo()
{
    int array[] = new int[123];

    array = createLargerArray(array, 456);

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


----------



## Siassei (11. Aug 2008)

Hallo,

arraycopy ist das große Zauberwort :wink:

Ein Beispiel mit int[] als PseudoCode

```
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 (12. Aug 2008)

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


----------



## SlaterB (12. Aug 2008)

ich sehe da keinen


----------



## Siassei (12. Aug 2008)

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 (12. Aug 2008)

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 (13. Aug 2008)

ok, ich versuchs mal als pseudocode...


```
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


----------



## SlaterB (13. Aug 2008)

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 (13. Aug 2008)

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


----------

