Einfaches array problem

Gast #6842700
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;
  }
Gast #6842713
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?
Gast #6842729
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.
Gast #6842745
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!
Gast #6842751
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
Gast #6842755
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;

  }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren