while schleife mit array

Guest1

Aktives Mitglied
hey leute,

ich bin schon wieder so verzweifelt.
die Aufgabe lautet: Schreiben Sie anhand der vorgebenen Zeilen die Methode enthaeltPaar(int[]), die true liefert, falls zwei darauffolgende Zahlen gleich sind.

und mein Code sieht so aus:
Code:
public static boolean paarEnthalten(int[] a) {

        int i = 0;

        while (i < a.length && a[i] == (a[i + 1])) {
            i = i + 1;

        }
        return i == a[i];
    }

    public static void main(String[] args) {

        System.out.println(paarEnthalten(new int[]{1, 2, 2, 3}));

    }

was habe ich schon wieder falsch gemacht?
 
Zuletzt bearbeitet:
Nimm deine beispielhaften Werte und geht Schritt für Schritt im Kopf oder auf Papier den Programmablauf durch. Das Programm ist so klein, dass das problemlos möglich ist.
 
Mal abgesehen von der while-Schleife:
Was genau soll deine return-Zeile denn tun? So wie die da steht, wird doch nur dann true returnt, wenn das i-te Element des Arrays auch die Zahl i enthält, das ist doch was ganz anderes als die Aufgabenstellung verlangt. Z.B. würde ein [0, 1, 2, 3, 4] Array auch true zurückgeben, obwohl dort keine doppelten Zahlen vorkommen.
 
Mal abgesehen von der while-Schleife:
Was genau soll deine return-Zeile denn tun? So wie die da steht, wird doch nur dann true returnt, wenn das i-te Element des Arrays auch die Zahl i enthält, das ist doch was ganz anderes als die Aufgabenstellung verlangt. Z.B. würde ein [0, 1, 2, 3, 4] Array auch true zurückgeben, obwohl dort keine doppelten Zahlen vorkommen.
wäre dann return i == a[i+1]; richtig ? ich wieß echt nicht mehr was ich da mache, habe noch 10 aufgaben die ich lösen muss, da ich aber keine musterlösung habe weiß ich nicht wie ich vorgehen soll
2. was kann ich denn in der while schleife ändern damit i immer hochzählt( bis i <a.length ) ?
 
Zuletzt bearbeitet:
Nein, dann wäre ja bspw. a = [1, 0, 1, 2, 3] ein Array was true zurückgibt, weil zb für i = 0 gilt: i == a[i + 1] = true.

Ich würde sagen, vergiss dein obiges Programm, da stimmt leider nur die int i = 0 Zeile.
Wir machen es so, ich beschreibe dir das Problem mal etwas strukturiert und du übersetzt das dann in Code.

- du durchläufst ein int-Array a
- du vergleichst in jedem Schritt den Wert der aktuellen Position mit dem Wert in der darauffolgenden
- sollten beide übereinstimmen, hast du ein Paar gefunden! dann muss true returnt werden
- wenn das Array durchlaufen wurde, ohne das ein Paar gefunden wurde, muss false returnt werden

Kleiner Tipp: wenn du in der while-Schleife ein Paar gefunden hast, kannst du dort einfach mit return true; den Programmablauf unterbrechen. Sollte kein Paar gefunden worden sein, kannst du also einfach return false; am Ende des Programms benutzen.
 
ich wieß echt nicht mehr was ich da mache, habe noch 10 aufgaben die ich lösen muss, da ich aber keine musterlösung habe weiß ich nicht wie ich vorgehen soll

Lernst du Java in der Schule/Studium oder aus eigenem Antrieb? Falls das erste der Fall ist, dann solltet ihr ja auch gewisse Grundlagen zur Lösung der Aufgaben erhalten.
 
Ich muss meinen letzten Post etwas revidieren. Das ganze soll ja vermutlich mit einer while-Schleife gelöst werden, was ich schrieb war aber eher auf for-Schleifen ausgelegt.

Daher nun noch mal für while-Schleifen:
Bei while-Schleifen musst du ja in die Klammern schreiben, wann sie weiterlaufen soll - und dementsprechend musst du wissen, wann sie abgebrochen werden soll. So falsch ist dein obiges Programm tatsächlich nicht, aber hierbei hast du dich etwas vertan - wann sollte die Schleife weiterlaufen, also weiter nach Paaren suchen? Und wann sollte sie aufhören nach Paaren zu suchen?

Neuer kleiner Tipp: nutze eine boolean-Variable zur Ausgabe, die du anfangs auf false setzt, bei Fund eines Pärchens auf true setzt und ganz am Ende returnst.
 
Ich muss meinen letzten Post etwas revidieren. Das ganze soll ja vermutlich mit einer while-Schleife gelöst werden, was ich schrieb war aber eher auf for-Schleifen ausgelegt.

Daher nun noch mal für while-Schleifen:
Bei while-Schleifen musst du ja in die Klammern schreiben, wann sie weiterlaufen soll - und dementsprechend musst du wissen, wann sie abgebrochen werden soll. So falsch ist dein obiges Programm tatsächlich nicht, aber hierbei hast du dich etwas vertan - wann sollte die Schleife weiterlaufen, also weiter nach Paaren suchen? Und wann sollte sie aufhören nach Paaren zu suchen?

Neuer kleiner Tipp: nutze eine boolean-Variable zur Ausgabe, die du anfangs auf false setzt, bei Fund eines Pärchens auf true setzt und ganz am Ende returnst.
danke
so einigermaßen habe ich das jetzt verstanden, also mein Code sieht jetzt so aus
Code:
public static boolean paarEnthalten(int[] a) {
       
        int i = 0;
       
        while ((i < a.length-1 && a[i] != a[i+1])){
           
            i = i + 1;
         
        }
        return i == a[i+1];
    }

    public static void main(String[] args) {

        System.out.println(paarEnthalten(new int[]{0,1,2,3,4,4})); // true


    }

wenn ich 2 gleiche werte im Array habe wird true gelifert wenn nicht bekomme ich eine Fehlermeldung wie out of Bounds Exception: 5
 
Gut, damit sollte die while-Schleife funktionieren.
Jetzt gibt's noch zwei Sachen zu tun:

1) Die Exception: Das Problem hierbei ist, dass du in deiner return-Zeile auf a[i + 1] zugreifen willst. Nach erfolgloser Beendigung der while-Schleife (kein Paar gefunden) hat i aber schon den Wert von a.length - 1 angenommen, das heißt i zeigt aufs letzte Element von a und i+1 ist somit ein undefinierter Bereich.
Der Grund, warum i bei a.length endet ist der, dass die while-Schleife ja auf i < a.length -1 eingestellt ist. D.h. bevor die Schleife abbricht ist i = a.length - 2. In diesem letzten Durchgang wird i dann durch i = i+1 aber auf a.length - 1 angehoben.
Ein einfacher Fix wäre, einfach statt a.length - 1 auf a.length - 2 zu prüfen. Dann vergleichst du ja a[a.length - 3] mit a[a.length - 2], und i wird danach auf a.length - 2 gesetzt.
Jetzt fehlt zwar noch der letzte Vergleich (a[a.length - 2] == a[a.length - 1]?), aber der wird ja in deiner return-Zeile dann getätigt.

2) Eine Kleinigkeit in der return-Zeile: du vergleichst hier wieder i (einen Index) mit einem Element von a. Versuche stattdessen lieber zwei Elemente von a zu vergleichen.
 
Gut, damit sollte die while-Schleife funktionieren.
Jetzt gibt's noch zwei Sachen zu tun:

1) Die Exception: Das Problem hierbei ist, dass du in deiner return-Zeile auf a[i + 1] zugreifen willst. Nach erfolgloser Beendigung der while-Schleife (kein Paar gefunden) hat i aber schon den Wert von a.length - 1 angenommen, das heißt i zeigt aufs letzte Element von a und i+1 ist somit ein undefinierter Bereich.
Der Grund, warum i bei a.length endet ist der, dass die while-Schleife ja auf i < a.length -1 eingestellt ist. D.h. bevor die Schleife abbricht ist i = a.length - 2. In diesem letzten Durchgang wird i dann durch i = i+1 aber auf a.length - 1 angehoben.
Ein einfacher Fix wäre, einfach statt a.length - 1 auf a.length - 2 zu prüfen. Dann vergleichst du ja a[a.length - 3] mit a[a.length - 2], und i wird danach auf a.length - 2 gesetzt.
Jetzt fehlt zwar noch der letzte Vergleich (a[a.length - 2] == a[a.length - 1]?), aber der wird ja in deiner return-Zeile dann getätigt.

2) Eine Kleinigkeit in der return-Zeile: du vergleichst hier wieder i (einen Index) mit einem Element von a. Versuche stattdessen lieber zwei Elemente von a zu vergleichen.
Danke für deine Mühe, jetzt bin ich erleichtert 🙂)
 

Neue Themen


Zurück
Oben