Zusammenführen von Feldern

volki.s89

Mitglied
Bei der Ausführung des Programms bekomme ich immer die Fehlermeldung:
java.lang.ArrayIndexOutOfBoundsException:4

Ich weiß echt nicht was ich falsch gemacht habe, das Programm soll einfach zwei Felder, die schon aufsteigend sortiert sind, zu einem neuen Feld, dass aufsteigend sortiert ist zusammenfügen.

Also der code lautet:

Java:
public class ZusammenführenFelder{

public static int[] merge(int f1 [], int f2[]){

    int n1 = f1.length;
    int n2 = f2.length;
    int n  = f1.length + f2.length;
    int[] f3 = new int[n];
    int i1 = 0;
    int i2 = 0;
    for (int i = 0; i<n;i++){
        if ( f1[i1]<=f2[i2]){
            f3[i] = f1[i1];
            i1++;
        }else{
            if (f2[i2]<=f1[i1]){
                f3[i] = f2[i2];
                i2++;}

    }
}
return f3;
}    
}


Ich wäre sehr dankbar, wenn mir jemand helfen könnte 🙂
 
Verstehst du denn was die ArrayIndexOutOfBoundsException dir sagen will?

Spiels doch mal auf Papier mit einem simplen Beispiel durch:

Array1: 1,2,3
Array2: 4,5,6
=>
n = 6

so die ersten drei Fälle ist f1 immer <= f2 (da 1,2,3 <= 4 ist) d.h. du erhöhst 3x i1, d.h. i1 ist dann = 3
im nächsten Schritt fragst du wieder ab
Code:
if (f1[i1] <= f2[i2]) {
i1 ist wie schon erwähnt 3, den Index 3 im Array1 gibt es aber nicht(nur 0,1,2)..daher fliegt dir dort die Exception!

Das war jetzt nur eine Konstellation, das Problem sollte aber klar sein, überlege dir also was du wie abändern musst
 
Erstmal danke, für die Antwort! Ich weiß jetzt auch wo das Problem ist, aber irgendwie will mir die Lösung nicht einfallen. Ich weiß echt nicht was heute los mit mir ist, aber ich steh voll auf dem Schlauch. 🙁
 
Also mir fällt nur das hier ein :

Wenn ich die Abbruchbedingung ändere, also for (int i = 0; i1<n1 & i2<n2;i++)

dann hört das Programm an genau dieser fehlerhaften Stelle auf, als nächsten schritt würde ich dann einfach den Rest von f2 an f3 hängen.

Gibt es noch eine andere Lösung ??
 
Du meinst so?

[Java]
public static int[] merge(int f1 [], int f2[]){

int n1 = f1.length;
int n2 = f2.length;
int n = f1.length + f2.length;
int[] f3 = new int[n];
int i1 = 0;
int i2 = 0;
int i;
for (i = 0 ; i1 < f1.length && i2 < f2.length ; i++){

if ( f1[i1] <= f2[i2]){
f3 = f1[i1];
i1++;
} else {
if (f2[i2] <= f1[i1]){
f3 = f2[i2];
i2++;
}
}
}
while (i1 < f1.length) {
f3 = f1[i1];
i1++;
i++;
}
while (i2 < f2.length) {
f3 = f2[i2];
i2++;
i++;
}
return f3;
}
[/Java]


Eine andere Möglichkeit als diese sehe ich mit Arrays nicht.
Du könntest eine Hilfsmethode schreiben, die das erste Element aus einem Array löscht.
Dann könntest du die beiden Arrays f1 und f2 nach und nach leeren und dann mit der Schleife stoppen, wenn beide Arrays leer sind.
Ich denke das wird aber komplizierter als die obige Lösung.
 
Hey erstmal denke, so hab ich es auch probiert aber, dann sagt er mir , dass er die variable i nicht findet.

Ich hab das jetzt etwas komplizierter hinbekommen, aber wenn diese Version irgendwie funktionieren würde, dann wäre das besser. Siehst du eine Möglichkeit, damit das Programm läuft ?
 
Hey erstmal denke, so hab ich es auch probiert aber, dann sagt er mir , dass er die variable i nicht findet.

Ich hab das jetzt etwas komplizierter hinbekommen, aber wenn diese Version irgendwie funktionieren würde, dann wäre das besser. Siehst du eine Möglichkeit, damit das Programm läuft ?


Bei mir funktionierts. Du musst halt nur den Parameter i aus der For Schleife nehmen, sonst ist i nur in der for schleife definiert.

Also nicht for (int i = 0 ...)

sondern:
int i;
for (i = 0; ...)
 
ja danke, hab ich vorhin auch gemerkt^^

vorher hab ich es aber so gelöst:

Java:
public class ZusammenführenFelder{

public static int[] merge(int f1 [], int f2[]){

    int n1 = f1.length;
    int n2 = f2.length;
    int n  = n1 + n2;
    int[] f3 = new int[n];
    int i1 = 0;
    int i2 = 0;
    for (int i = 0; i1<n1 & i2<n2;i++){
        if ( f1[i1]<=f2[i2]){
            f3[i] = f1[i1];
            i1++;
        }else{
            if (f2[i2]<=f1[i1]){
                f3[i] = f2[i2];
                i2++;}

    }
        if (i1 == n1 || i2 == n2){
    while ( i1 < n1 || i2 <n2){
    
        if ( i1<n1){
            i++;
            f3[i] = f1[i1];
            i1++;
        }else{
        if (i2<n2)
            i++;
            f3[i] = f2[i2];
            i2++;}  
        
   
    }
        }

}    
return f3;
}
}

umständlich, man man man warum hab ich nicht einfach vorher das i aus der for Schleife entfernt. Das hätte mir eine menge Zeit erspart^^
 

Neue Themen


Zurück
Oben