# Array-Hausübung - ArrayIndexOutOfBoundsException



## Mampf (30. Mai 2010)

Hallo!

Bräuchte etwas Hilfe bei folgender Aufgabenstellung:

Ziel ist es, den Benutzer ganzzahlige Werte für zwei Arrays einlesen zu lassen (der Benutzer gibt vorher die Längen der beiden Arrays an und wird nach werten für jede Position gefragt)
Die Werte der beiden Arrays sollen dann in ein drittes Array, welches so groß wie die beiden vorigen ist eingelesen werden und absteigend sortiert werden.

Das ganze Drumherum funktioniert schon, bloß die Sortierung bereitet mir einiges Kopfzerbrechen.


```
for (int i=0; i <=f3.length; i++) { //solange i <= Länge des Arrays 3 ist

  int hv = 0; //hv = hilfsvariable


  if(f3[i] < f3[i+1]) {

    hv = f3[i];
    f3[i] = f3[i+1];
    f3[i+1] = hv;

  }

}
```

wäre meine Überlegung, durch das f3[i+1] bekomme ich aber eine ArrayIndexOutOfBoundsException beim Kompilieren - logisch, da bei der letzten Position ja wiederum i mit i+1 verglichen wird, aber i+1 nicht mehr im Array ist.

Mein Lehrer hat mir vorgeschlagen, zwei verschachtelte for-Schleifen zu erstellen, um jede Position im Array mit allen anderen zu vergleichen, aber irgendwie komm ich einfach nicht auf die Lösung...

Schon mal danke für eure Hilfe


----------



## cr33p (30. Mai 2010)

Probiers mal mit Selection Sort.
Klick

Musst du denn selber ein Sortierverfahren implementieren oder kannst du auch auf Java-Mittel zurückgreifen? Wenn ja, 

```
Arrays.sort(array);
```


----------



## Mampf (30. Mai 2010)

AFAIK sollte ich selber sortieren (Bubble-Sort), aber explizit ist es nicht angegeben.

Thx.


----------



## Final_Striker (30. Mai 2010)

Mampf hat gesagt.:


> wäre meine Überlegung, durch das f3[i+1] bekomme ich aber eine ArrayIndexOutOfBoundsException beim Kompilieren - logisch, da bei der letzten Position ja wiederum i mit i+1 verglichen wird, aber i+1 nicht mehr im Array ist.



Also wenn dir das logisch ist, wäre es wahrscheinlich auch logisch die Abbruchbedingung jetzt so anzupassen, dass es nicht mehr übers Array läuft.



Mampf hat gesagt.:


> Mein Lehrer hat mir vorgeschlagen, zwei verschachtelte for-Schleifen zu erstellen, um jede Position im Array mit allen anderen zu vergleichen, aber irgendwie komm ich einfach nicht auf die Lösung...



Ja du brauchst 2 for-Schleifen.

Was du im Moment macht ist nur:

1 5 2 6 -> 5 2 6 1

deshalb deinen Ansatz in noch eine for-Schleife packen die über das Array läuft. Dieses Sortierverfahren nennt man übrigens BubbleSort. ;-)


----------



## Mampf (30. Mai 2010)

Also gut, wie passe ich denn die Abbruchbedingung (das ist das i <=f3.length;, oder?) richtig an.
Vielleicht das i vorher 1 setzen, aber dann wird ja das letzte Feld nicht mehr verglichen..

Wegen der zwei For-Schleifen: einfach in die erste Schleife die selbe nochmal einfügen und darin dann sortieren?

Falls alle Stricke reißen versuch ichs mit 
	
	
	
	





```
Arrays.sort(f3);
```
, theoretisch dürfte der Lehrer nichts sagen, wenn die Aufgabenstellung so aussieht: Gesucht ist ein Java-Programm, das ein absteigend sortiertes Feld f3 aus f1 und f2 berechnet, sodass f3 alle Zahlen in absteigend sortierter Reihenfolge enthält, die in f1 und f2 vorkommen


----------



## eRaaaa (30. Mai 2010)

Mampf hat gesagt.:


> Also gut, wie passe ich denn die Abbruchbedingung (das ist das i <=f3.length;, oder?) richtig an.
> Vielleicht das i vorher 1 setzen, aber dann wird ja das letzte Feld nicht mehr verglichen..



Beispiel:
Array : [0,1,2,3,4] - array.length = 5
Du willst jetzt von 0 bis *einschließlich* ( <=  ) Index 5 iterieren, also auch array[5] ...(bzw sogar 6)

Fällt dir was auf?


----------



## Final_Striker (30. Mai 2010)

Mampf hat gesagt.:


> Also gut, wie passe ich denn die Abbruchbedingung (das ist das i <=f3.length;, oder?) richtig an.



So das die Schleife nicht bis zum letzten, sondern nur bis zum vorletzten Feld läuft.


----------



## Mampf (30. Mai 2010)

ah....kann sein, dass dass jetzt falsch ist, aber vielleicht i < f3.length?

Da wären wir dann bei der zweiten for-Schleife.

Edit: Wenn die Schleife nur bis zum vorletzten Feld läuft, wird doch das letzte nicht mehr verglichen, oder bring ich da etwas durcheinander?


----------



## Mampf (30. Mai 2010)

Danke, java.util.Array.sort hat das Problem schnell und einfach gelöst


----------



## Landei (30. Mai 2010)

Noch mal ganz langsam zum Mitmeißeln:

array.length gibt die Anzahl der "freien Plätze" im Array an. Die Plätze werden aber (aus gutem Grund) beginnend mit 0 numeriert. Ein Array mit array.length==5 hat also die Indizes 0,1,2,3,4. Eine Schleife über ein Array geht immer von 0 bis array.length-1, üblich ist also der Test schleifenvariable < array.length (niemals <=).


----------



## Mampf (31. Mai 2010)

Danke...jetzt versteh ich's


----------

