Vokale

Sebaaaa

Aktives Mitglied
Hallo kleines Problem,
Ich soll in einem beliebigen String S rekursiv überprüfen, ob Vokale vorhanden sind.
Boole hasVowel(String S)
Es soll der Kopf des Strings und der restliche Teil überprüft werden.
Hab mich schon etwas damit beschäftigt aber irgentwie wills nicht klappen.
Java:
public class Vowels {

	public static boolean hasVowel(String s  ) {
		char[] S = s.toCharArray(); s.toLowerCase();
		int L = s.length();
		if ( L==0){ return false;
                 }
		
		
		
		if (s ==""){
			return false;
		}
		if (S[0]=='a'|S[0]=='e'|S[0]=='i'|S[0]=='o'|S[0]=='u'){
			return true ;
		}
		else{ 
			String R = s.substring(0, S.length-1);
			return hasVowel(R);
		}
		
	}

Weiß jmd. was ich vergessen bzw. falsch gemacht habe, oder ist der ganze Ansatz fehlerbehaftet?
 

Joose

Top Contributor
Weiß jmd. was ich vergessen bzw. falsch gemacht habe, oder ist der ganze Ansatz fehlerbehaftet?

Ja du rufst
Code:
substring
mit den falschen Parameter auf.
Du willst ja ab dem 2.Zeichen (Index = 1) den "neuen" String haben oder?

Java:
public class Vowels {
	public static boolean hasVowel(String s  ) {
		char[] S = s.toCharArray(); s.toLowerCase();
		int L = s.length();
		if ( L==0){ return false;
                 }		
		if (s ==""){
			return false;
		}
		if (S[0]=='a'|S[0]=='e'|S[0]=='i'|S[0]=='o'|S[0]=='u'){
			return true ;
		}
		else{ 
			String R = s.substring(0, S.length-1);
			return hasVowel(R);
		}
	}

Ansonsten zu deinem Code:
  • pro Zeile nur 1 Anweisung!
  • Strings sind immutable, daher musst du das Ergebnis von "toLowerCase" wieder einer Variable zufügen
  • wenn du "toLowerCase" erst nach "toCharArray" aufrufst, hat es keine Auswirkung mehr auf das Array
  • Verwende sprechende Namen für Variablen statt "L" und "R"
  • Ein OR für boolsche Werte wird in Java mit "||" gemacht!
  • String (bzw. alle Objekte) werden in Java mit
    Code:
    .equals
    verglichen nicht mit ==
 

Sebaaaa

Aktives Mitglied
Ja gut danke.
Das war jetzt recht informativ und hilfreich für die Formatierung und die Begrifflichkeiten.
Aber das eigentliche Problem liegt immer noch darin das es nicht tut was es soll?
 

Joose

Top Contributor
....
Aber das eigentliche Problem liegt immer noch darin das es nicht tut was es soll?

Das Problem habe ich dir doch oben schon beschrieben!
Der rekursive Aufruf passiert mit dem falschen Substring!
Lass dir ganz zu Beginn deiner Methode deinen Parameter auf der Konsole ausgeben, dann siehst du das Problem!

Java:
String R = s.substring(0, S.length-1);
return hasVowel(R);

Hier liegt das Problem ... bei dem Aufruf von
Code:
substring
 

Joose

Top Contributor
Ich habe dir die Zeilen, wo dein Denkfehler ist gezeigt.
Ja diesen Fehler meinte ich, weil es der grundlegende Fehler in deiner Methode ist!

Ich habe dir auch schon gesagt wie der Fehler behoben (Index ändern) wird, bzw. wie du ihn der veranschaulichen kannst (Konsolenausgaben). Jetzt ist Eigeninitiative gefragt von dir!
 

Joose

Top Contributor
Aber läuft nicht so wie ich mir das vorstelle
Trotzdem danke!

Ist dein Problem nun behoben? Oder ist es nur ein anderes?

Für die Zukunft .....
Wie schon in vielen anderen Threads immer wieder erwähnt: "läuft nicht", "funktioniert nicht", "klappt nicht" usw. sind keine guten Fehlerbeschreibungen.

Am Besten immer mit Beispiel liefern: was ist der "Eingabewert", was ist das gewünschte Ergebnis und was kommt stattdessen
Mit diesen Daten kann man das Problem nachvollziehen.
 

Sebaaaa

Aktives Mitglied
Ein Vokal wird nicht erkannt
Wenn ein String am Ende einen Vokal hat,
Wenn ein großer Vokal im 2ten Teil des Strings ist und
Wenn ein kleiner Vokal im 2ten Teil des Strings ist.
 

Joose

Top Contributor
Ein Vokal wird nicht erkannt
Wenn ein String am Ende einen Vokal hat,
Wenn ein großer Vokal im 2ten Teil des Strings ist und
Wenn ein kleiner Vokal im 2ten Teil des Strings ist.

In meinem 1.Post habe ich dir nach Anmerkungen zu deinem Code gegeben!
Wenn du den 2. und 3. Punkt beachtest sollte sich das mit dem großen Vokal zB beheben.

Ansonsten noch eine kleine Anpassung beim Aufruf von
Code:
substring
Java:
String R = s.substring(1); // ohne 2.Paramter, so wird automatisch vollständige String ab dem X.Zeichen genommen!
 

Sebaaaa

Aktives Mitglied
Das hab ich gleich danach behoben aber es macht leider keinen Unterschied:/
Ich werde einfach noch ein bisschen rum probieren und schauen ob sich noch was ergibt;)
Aber vielen Dank!
 

Ähnliche Java Themen

Neue Themen


Oben