Hey, ich bringe mir gerade Java programmieren bei und sitze jetzt seit einger Zeit an einer Stelle an der ich verzweifele. Bin es auf dem Papier unendlich oft durchgegegangen und ich sehe keinen Fehler. Aber wahrscheinlich macht der Code einfach was anderes als ich denke. Ausgangsstellung. Ich habe 2 Arrays a und b die bereits sortiert sind. z.b. a= 1,4,5 und b=2,5,6 Diese sollen in ein drittes array c übergeben werden sodass c= 1,2,4,5,5,6 raus kommt. Für einen Programmier Profi eine Übung zum einschlafen aber ich seh den Fehler nicht. Der wichtige Teil des Programms- Die Fehlermeldung ist übrigens Index out of bonds. Bringt mich aber auch nicht weiter obwohl ich weiß was die Meldung bedeutet public static int[] zusammen(int[] a, int[] b) { int x = a.length + b.length; int[] c = new int[x]; int countera = 0; int counterb = 0; for (int i = 0; i < x; i++) { if (a[countera] <= b[counterb]) { c[i] = a[countera]; countera++; } else { c[i] = b[counterb]; counterb++; } } return c; }
Was passiert, wenn alle Elemente in a schon verbraucht sind und noch eines in b ist? Ganz allgemein (wird Dir bei späteren Tests noch auf die Füße fallen): Was passiert, wenn alle Elemente in a kleiner sind als die Elemente in b?
Hab den Fehler glaub gefunden. public static int[] zusammen(int[] a, int[] b) { int x = a.length + b.length; int[] c = new int[x]; int countera = 0; int counterb = 0; int i=0; while ( countera<a.length && counterb<a.length) { if (a[countera] <= b[counterb]) { c[i] = a[countera]; countera++; i++; } else { c[i] = b[counterb]; counterb++; i++; } } return c; } Jetzt wird aber das letzte Element =0 gesetzt. Warum das denn?
Jetzt brichst Du den Vorgang ab, wenn a oder b verbraucht sind. Dann ist aber mindestens eines noch im anderen drin. Falls alle a kleiner sind als alle b, dann sind sogar die letzten 3 in c = 0.
Markus K. schrieb: > Was passiert, wenn alle Elemente in a schon verbraucht sind und noch > eines in b ist? eine wichtige Frage, die du nicht beachtet hast
fehlt noch schrieb: > Markus K. schrieb: > >> Was passiert, wenn alle Elemente in a schon verbraucht sind und noch >> eines in b ist? > > eine wichtige Frage, die du nicht beachtet hast Dann wird doch abgebrochen weil die while Bedingungen countera<a.length nicht mehr erfüllt wird oder?
Arry schrieb: > Dann wird doch abgebrochen weil die while Bedingungen countera<a.length > nicht mehr erfüllt wird oder? Ja, korrekt. Aber was ist mit den Elementen, die noch nicht "verbraucht" wurden? Wie kommen diese unverbrauchten Elemente nach "c"? Mach doch mal ein gedankliches Experiment mit: a = [1, 2] b = [9, 9] Kleiner Tip: Nach dem while-Rumpf, vor dem return, fehlt noch was.
Arry schrieb: > if (a[countera] <= b[counterb]) { if b leer oder a<=b dann kopiere Einträge aus a und die zweite Bedingung genauso: if a leer oder b<=a dann kopiere die Einträge aus b
Arry schrieb: > while ( countera<a.length && counterb<a.length) funktioniert das überhaupt? wäre
1 | while(i<x){ |
2 | //blabla
|
3 | }
|
nicht besser?
fehlt noch schrieb: > Arry schrieb: > >> while ( countera<a.length && counterb<a.length) > > funktioniert das überhaupt? wäre > while(i<x){ > //blabla > } > > nicht besser? Hab ich schon probiert. Da kam dann auch der Index out of Bonds fehler
fehlt noch schrieb: > funktioniert das überhaupt? Naja, es gibt (mindestens) zwei Sichtweisen auf auf das Problem: a.) Von der "Eingabe-Seite" aus: Man schaufelt so lange das kleinste Element zum Ziel, bis eins der beiden Eingabe-Array leer ist. Anschließend noch den Rest des anderen Arrays. b.) Von der "Ausgabe-Seite" aus: Man holt sich solange das kleinste Element aus einem Array, solange beide Arrays noch Elemente haben, oder nur noch Elemente aus dem verbleibendem Array, wenn das andere leer ist. Arry schrieb: > Hab ich schon probiert. Da kam dann auch der Index out of Bonds fehler Nicht probieren, sondern nachdenken, verstehen und dann Aha-Effekt!
fehlt noch schrieb: > if b leer oder a<=b dann kopiere Einträge aus a > > und die zweite Bedingung genauso: > > if a leer oder b<=a dann kopiere die Einträge aus b So, wie das formuliert ist, ist es nicht richtig...
Arry schrieb: > Hab ich schon probiert. Da kam dann auch der Index out of Bonds fehler mit Sicherheit nicht von da: array schrieb: > for (int i = 0; i < x; i++) { aber wenn du auf Arrayelemente zugreifst, die nicht da sind. Also wenn z.B. die beiden Arrays unterschiedlich lang sind. array schrieb: > if (a[countera] <= b[counterb]) { du musst erst mal schauen, ob dieses Element vorhanden ist! fehlt noch schrieb: > if b leer oder a<=b dann kopiere Einträge aus a > > und die zweite Bedingung genauso: > > if a leer oder b<=a dann kopiere die Einträge aus b
fehlt noch schrieb: > Arry schrieb: >> Hab ich schon probiert. Da kam dann auch der Index out of Bonds fehler > > mit Sicherheit nicht von da: > > array schrieb: >> for (int i = 0; i < x; i++) { > > aber wenn du auf Arrayelemente zugreifst, die nicht da sind. Also wenn > z.B. die beiden Arrays unterschiedlich lang sind. > > array schrieb: >> if (a[countera] <= b[counterb]) { > > du musst erst mal schauen, ob dieses Element vorhanden ist! > > fehlt noch schrieb: >> if b leer oder a<=b dann kopiere Einträge aus a >> >> und die zweite Bedingung genauso: >> >> if a leer oder b<=a dann kopiere die Einträge aus b hab jetzt ganz einfach gemacht und alle 4 möglichen fälle mit if else schleifen hin geschrieben. unschön aber es funktioniert public static int[] zusammen(int[] a, int[] b) { int lange = a.length + b.length; int[] c = new int[lange]; int countera = 0; int counterb = 0; for (int i = 0; i < lange; i++) { if (countera == a.length) { c[i] = b[counterb]; counterb++; } else if (counterb == b.length) { c[i] = a[countera]; countera++; } else if (a[countera] <= b[counterb]) { c[i] = a[countera]; countera++; } else if (a[countera] > b[counterb]) { c[i] = b[counterb]; counterb++; } } return c; }
fehlt noch schrieb: > Beitrag "Wie 2 Arrays zusammenfügen und sortieren?" wie geil haha dann weiß ich wenigstens dass jemand genau ein Jahrgang über mir das gleiche Problem hatte. Muss jemand aus meinem Studiengang sein da die vorgegebenen Module 1:1 gleich sind
arra1y schrieb: > if (countera == a.length) diese Wiederholungen zusammenfassen:
1 | if (countera == a.length || a[countera] >= b[counterb]) { |
2 | c[i] = b[counterb]; |
3 | counterb++; |
4 | }
|
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.