Zeichen in String vergleichen

Hallo ich sollte eine Methode implementieren boolean wort(String s).Diese soll überprüfen, ob der in s übergebene String ein “Schnapswort” ist, bei dem der n-te Buchstabe jeweils auch n mal hintereinander auftritt.Beispiel : “1223334444”, “ABBCCCDDDDEEEEE” Ich hab den Code geschrieben aber passt nicht ganz. Kann mir jemand helfen?

 boolean wort(String s) {

		int h = 1;
		int k = 2;
		int l = k-h;
		int z = 1;
		
		for (int i = 1; i<=s.length();i++){

		for (int j = h; j < k; j++) {
			
			if (l != z ){
				return false;
			}

				char a = s.charAt(j);
				char b = s.charAt(j+1);
			
				z++;

				if (a != b) {
					return false;
				}
			
		}
		h+= i+1;
		k+= i+2;
		}return true;
	```

die Schleifen wirst du doch nicht ganz ohne Hintergedanken geschrieben haben,
auch wenn ich lieber nicht komplett versuche, ihn abzulesen

was war dein Plan, wie willst du zum Test vorgehen?,
welche Zeichen sollen alles in der ersten Unterschleife verglichen werden, wie genau das in wieviel Schritten,
was kommt danach als zweite große Gruppe dran usw.

ob es dann im Programm genau so abläuft kannst du doch mit System.out.println() in den Schleifenschritten, Ausgabe aller relevanten Variablen, prüfen

                char b = s.charAt(j+1);

da gehört sofort eine Ausgabe hin
‚vergleiche nun Index … und …, Zeichen … und …‘
dazu hier der Nähe oder bei Änderung z ausgeben, k, l usw. und vergleichen mit deinem Plan, ob es jeweils stimmt,

(bei solchen Variablennamen können andere wirklich kaum etwas inhaltlich sagen, höchstens noch eigene fertige Version schreiben :wink: )

Also beim Programmieren gilt wie sonst nirgends das alte Sprichwort:

Wissen heißt: wissen wo 's steht!
Und für Java ist die API eine ergiebige Quelle des Wissens:Java Platform SE 8

Getreu dem Motto wäre mein Plan so:
[ol]
[li]ermittle alle unterschiedlichen Buchstaben[/li]Zum Glück müssen wir das nicht selbst machen, sondern werfen einfach in der ersten Schleife jedes Zeichen einzeln in ein [JAPI]TreeSet[/JAPI], das enthält anschließend keine doppelten Zeichen mehr, und das sogar sortiert.
[li]in einer weiteren Schleife würde ich über die Liste der „unique chars“ laufen.[/li]für den aktuellen Bchstaben würde ich mittels String.indexOf() seine erste Position im String ermitteln. Nennen wir sie mal i.
[li]Danach kann ich in einer weiteren (diesmal inneren) Schleife feststellen, ob die i-1 Zeichen nach i der selbe Buchstabe ist.[/li][li]Jetzt muss ich mir nur noch überlegen, ob ich immer alle Zeichen prüfen muss, oder ob es eine clevere Abbruchbedingung gibt. [/li]Wenn man die beiden Teilschritte („unique chars“ ausfiltern und Wort Prüfen) in eigene Methoden schreibt kann man die letztere uU. schon vorzeitig mit einem passenden Rückgabewert verlasen.
[/ol]

bye
TT

Es gibt so viele Möglichkeiten, das Problem anzugehen. Wichtig ist, nicht alles “auf einmal” zu wollen - beim Jonglieren lernen fängt man auch nicht mit sieben Bällen an.

Suche dir eine Teilaufgabe, dir sinnvoll und lösbar erscheint. Oder wenn dir nichts einfällt, löse vielleicht erst einmal eine einfachere Version des Problems. Ganz wichtig: Wenn du so eine Teilaufgabe “gelöst” hast, vergewissere dich, dass sie wirklich das tut, was du denkst, das sie tut. Dann, und erst dann, kannst du das nächste Teilproblem angehen.

Also, was könnte hier eine sinnvolle Teilaufgabe sein? Wie wäre es z.B. damit, erst einmal alle Teilstücken der gewünschten Länge zu finden?

Spiele ein wenig herum, sei kreativ.

@Timothy_Truckle : Ich weiß nicht, ob nicht zum Beispiel eine Eingabe “xyyxxx” oder auch “xxxxxx” erlaubt wäre, da könnte es mit dem Treeset haken, oder ich habe die Sache nicht zuende gedacht.

Wenn man davon ausgeht, dass eine Schnapszahl nur eine Ziffer enthält also z.B. 22, müsste ein Schnapswort nur einen Buchstaben (z.B. xxx) enthalten. (Ich habe dazu auch etwas im Netz gefunden). Zu beachten wäre hier die Grosz- bzw Kleinschreibung. Also müsste auch xXx ein Schnapswort sein.

Falls meine Definition von Schnapswort nicht der gewünschten entspricht (offensichtlich der Fall), bitte meinen Beitrag ignorieren.

[quote=Crian]Ich weiß nicht, ob nicht zum Beispiel eine Eingabe „xyyxxx“ oder auch „xxxxxx“ erlaubt wäre, da könnte es mit dem Treeset haken, oder ich habe die Sache nicht zuende gedacht.[/quote]Stimmt, da würde der TreeSet-Ansatz scheitern. Die Beispiele gaben dass aber nicht her.

Man sieht: alles steht und fällt mit den Anforderungen…
:stuck_out_tongue_winking_eye:

bye
TT

Mal eine Version, gefunden im anderen Forum, zum vergleich:

        String text = "abbcccddddeeeeeffffff";
        String text2 = text.toUpperCase();
        System.out.println(schnaps(text));
        System.out.println(schnaps(text2));
    }
    static boolean schnaps(String text) {
        try {
            for (int i = 0, j = 1; i < text.length(); i += j, j++) {
                System.out.println(text.substring(i, i + j)); // just an output ....
                char befor = i > 0 ? text.charAt(i - 1) : (char) (text.charAt(i) - 1);
                char after = text.charAt(i);
                if (befor + 1 != after) {
                    return false;
                }
                for (int k = i; k < i + j; k++) {
                    if (text.charAt(k) != after) {
                        return false;
                    }
                }
            }
        } catch (StringIndexOutOfBoundsException sioobe) {
            return false;
        }
        return true;
    }```

75 Antworten im ‚anderen Forum‘, alles zwischen gestern 11:00 und heute 10:45 in 24 Stunden, was für ein Thema :wink:
und rectan kann sogar fleißig selber mitschreiben…

ach ja, ein abgespaltetes Fortführen-Thema ‚Schnapsstring‘ mit 8 Antworten auch noch

[quote=Unregistered]char befor = i > 0 ? text.charAt(i - 1) : (char) (text.charAt(i) - 1); char after = text.charAt(i); if (befor + 1 != after) { return false; }[/quote]Die Variante ist ja noch restriktiver als mein TreeSet-Ansatz, die will ja dass die Buchstaben im String immer im Alphabet aufeinander folgen…

bye
TT