Forum: PC-Programmierung Einfaches array problem


von array (Gast)


Lesenswert?

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;
  }

von Markus K. (markus-)


Lesenswert?

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?

von Arry (Gast)


Lesenswert?

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?

von Markus K. (markus-)


Lesenswert?

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.

von fehlt noch (Gast)


Lesenswert?

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

von Arry (Gast)


Lesenswert?

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?

von Einer (Gast)


Lesenswert?

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.

von fehlt noch (Gast)


Lesenswert?

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

von fehlt noch (Gast)


Lesenswert?

Arry schrieb:
> while ( countera<a.length && counterb<a.length)

funktioniert das überhaupt? wäre
1
while(i<x){
2
 //blabla
3
}

nicht besser?

von Arry (Gast)


Lesenswert?

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

von Einer (Gast)


Lesenswert?

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!

von Einer (Gast)


Lesenswert?

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

von fehlt noch (Gast)


Lesenswert?

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

von arra1y (Gast)


Lesenswert?

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;

  }

von fehlt noch (Gast)


Lesenswert?


von arra1y (Gast)


Lesenswert?

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

von fehlt noch (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.