String/Char-API

carsten_java

Mitglied
Hallo zusammen!
Ich möchte folgende Aufgabe lösen:

Die Methode istName nimmt eine Zeichenkette als Argument an und gibt einen Wahrheitswert zurück, ob sie ausschließlich Buchstaben oder Bindestriche ('-') enthält. Ein Bindestrich darf aber nicht als erstes oder letztes Zeichen auftreten. Es sind keine White Spaces zugelassen, auch nicht am Anfang oder Ende. Eine leere Zeichenkette ist ein gültiger (eben leerer) Name. Z.B. ergibt ein Aufruf mit dem Argument "Lisa-", "R2-D2" oder "Johann Wolfgang" den Wert false (letzteres sind zwei Namen). Ein Aufruf mit dem Argument "Brad-Arnold" oder "ey" ergibt den Wert true.

Meine Lösung sieht folgendermaßen aus:

String/Char-API Aufgabe:
public class bindestrich{
    public static boolean istName(String n){
        boolean z = true;
        if (n.isEmpty()){
            return true;
        }
        if (n.indexOf(' ') == 0 | n.indexOf('-') == 0 | n.lastIndexOf(' ') == n.length() - 1 | n.lastIndexOf('-') == n.length() - 1){
            return false;
        }
        int i = 0;
        while (i<0){
            char c = n.charAt(i);
            if (!Character.isLetter(c) & c != '-' & c == ' '){
                return false;
            }
            else{
                return true;
            }
        }
        return z;
    }
}

Leider wird bei "R2-D2" und "Johan Wolfgnag" der falsche Wahrheitswert ausgegeben. Nach langem Suchen und mehrmaligem Herumprobieren habe ich den Fehler nicht gefinden.

Könnt ihr mir hierbei vielleicht weiterhelfen und erklären wo der Fehler ist und warum das Programm mit dieser Lösung nicht richtig ausgeführt wird?

VG
Carseten
 

kneitzel

Top Contributor
Also neben dem Punkt, dass er in die Schleife nie hinein geht, wäre da direkt noch etwas, das ich ansprechen möchte:

Du hast eine Schleife und in der Schleife eine Bedingung. Die Bedingung hat aber immer ein return.
==> Die Schleife wird also sofort verlassen und die Schleife ist so einfach sinnlos. Vom Sinn her ist das while hier bei dem Code nichts anderes als ein if.

Generell ist das Pattern immer das folgende:
Annahme eines Falles.
Schleife über alle Elemente, ob der angenommene Fall richtig ist. Falls nein, dann hat man ein Ergebnis und springt zurück.
Nach der Schleife: Die Annahme ist bestätigt und wir geben die Annahme zurück.

Also konkretes Beispiel wäre z.B. die Prüfung: String enthält nur kleine Buchstaben:
Java:
public static boolean onlySmallLetters(final String text) {
    // Annahme ist: Ja, alle zeichen sind kleine Buchstaben: true
    for (char ch : text.toCharArray()) {
        // Gegenteil wird geprüft
        if (ch < 'a' || ch >'z') return false; // Resultat steht ja mit nur einem gefundenen Fall fest.
    }
    
    // Es wurden alle Zeichen geprüft und alles ist korrekt:
    return true;
}

Und noch ein wichtiger punkt, auf den Du sehr gut achten musst:
Du veränderst i in der Schleife nicht und damit hättest Du eine Endlosschleife. (Aber die anderen beiden Punkte verhindern dies natürlich - so kommst Du ja nie in die Schleife und wenn, dann würdest Du diese sofort wieder verlassen.)
 

temi

Top Contributor
Und als Ergänzung zu dem von @kneitzel Gesagten:

Es gibt in Java unterschiedliche Schleifenarten. Du hast hier die while-Schleife, bei der die Bedingung am Anfang überprüft wird.
Java:
while(bedingung) {
    // mach was
}
Wenn die Bedingung nicht erfüllt ist, dann wird auch nichts gemacht.

Es gibt auch noch die do-while-Schleife:
Java:
do {
    // mach was
} while (bedingung)
Hier wird die Bedingung erst am Ende überprüft, es wird also mindestens einmal etwas gemacht.

Zuletzt gibt es noch die for-Schleife, die typischerweise eine Zählschleife ist.
 

carsten_java

Mitglied
Also wird immer, wenn in der Schleife eine Bedingung
Du hast eine Schleife und in der Schleife eine Bedingung. Die Bedingung hat aber immer ein return.
==> Die Schleife wird also sofort verlassen und die Schleife ist so einfach sinnlos. Vom Sinn her ist das while hier bei dem Code nichts anderes als ein if.
Also wird immer, wenn ein Fall in der Schleife zutrifft auf den entsprechenden Wahrheitswert gesetzt, das Programm beendet und dieser Wahrheitswert dann ausgegeben?
Wäre es dann richtig, wenn man anstatt der return-Anweisungen schreiben würde z=true, oder z=false?
 

kneitzel

Top Contributor
Wäre es dann richtig, wenn man anstatt der return-Anweisungen schreiben würde z=true, oder z=false?
Nein, das ist auch problematisch, denn dann würden ja alle Ergebnisse immer überschrieben und Du hättest am Ende nur das Ergebnis der letzten Prüfung.

Wenn ich Dir einen Zettel mit ganz vielen Ziffern gebe und du sollst mir sagen: Sind da auch 9er drauf. Dann gehst Du doch so vor:
Du gehst alle Ziffern durch, sobald Du eine 9 gefunden hast, weißt Du: Es gibt auch 9er auf dem Zettel. Also kannst Du abbrechen und sagen: Ja, es sind 9er auf dem Zettel. Wenn Du aber den ganzen Zettel durchgegangen bist und hast keine 9 gefunden: Dann sagst Du: Es gibt keine 9er.

Und so sieht es dann auch in einer Schleife aus:
Du gehst alle Elemente durch. Sobald du ein Zeichen gefunden hast, das kein kleiner Buchstaben ist, dann weisst Du: Es sind nicht nur kleine Buchstaben vorhanden. Und da macht ein Return Sinn, denn damit brichst Du die Suche auch ab.
Wenn Du alles geprüft hast und hast kein Zeichen gefunden, dass kein kleiner Buchstabe ist, dann hast Du auch ein Ergebnis, dass Du zurück geben kannst.

Den Fall mit der Variablen, die immer gesetzt wird, könnte man aber auch durchspielen, den technisch kann es gehen, so man die Schleife abbricht:
Java:
boolean result = true;
for (char zeichen: alleZeichen) {
    if (isSmallCharacter(zeichen)) {
        result = true;
    } else {
        result = false;
        break;
    }
}

return result;

Wenn wir den leeren String prüfen, dann sind da keine Zeichen drin, die keine Kleinbuchstaben sind. daher initialisieren wir result auf true.
In der Schleife result auf true setzen ist jetzt aber unnötig. Result ist doch bereits true. Dadurch wird also nichts verändert.
Sobald da aber ein Zeichen kommt, das kein Kleinbuchstabe ist, dann wird die Schleife abgebrochen.

Mit dem Hintergrundwissen vereinfacht sich der Code dann schnell zu:
Java:
for (char zeichen: alleZeichen) {
    if (!isSmallCharacter(zeichen)) {
        return false;
    }
}

return true;

Hat dies geholfen, es etwas besser zu verstehen?
 

temi

Top Contributor
Also wird immer, wenn ein Fall in der Schleife zutrifft auf den entsprechenden Wahrheitswert gesetzt, das Programm beendet und dieser Wahrheitswert dann ausgegeben?
Wäre es dann richtig, wenn man anstatt der return-Anweisungen schreiben würde z=true, oder z=false?
Die Bedingung hat aber immer ein return.
Damit ist nicht die "return" Anweisung gemeint, die i.d.R. einen Wert zurück gibt. Es ist damit gemeint, dass die Schleife abgebrochen wird, wenn die Bedingung nicht mehr zu trifft. Je nachdem ob die Bedingung am Anfang oder am Ende geprüft wird (siehe auch #6) wurde die Schleife mindestens einmal durchlaufen oder auch nicht (damit sind die Anweisungen im Schleifenrumpf, innerhalb der geschweiften Klammern, gemeint).

Es ist allerdings durchaus möglich innerhalb des Schleifenrumpfs eine "return" Anweisung zu haben, die dann nicht nur die Schleife, sondern die ganze Methode verlässt. Siehe das letzte Beispiel in #8: Die Methode wird beendet, wenn die if-Bedingung innerhalb des Schleifenrumpfs erfüllt ist.

EDIT: Evtl. habe ich allerdings deine Frage falsch verstanden. Sei es drum ;)
 
Zuletzt bearbeitet:

kneitzel

Top Contributor
Wenn die return Anweisung in der main()-Methode ist wird das Programm beendet, ansonsten die Methode in der das return steht.
Also dem ersten Punkt möchte ich widersprechen. Ich habe regelmäßig Applikationen, die weiter laufen, obwohl die main() Methode sich schon beendet hat (Swing / JavaFX aber auch Spring Boot ... Es gibt viele Bereiche, in dem dies so ist).
Eine Java Applikation beendet sich ansonsten erst, wenn alle Threads, die nicht als Background Thread markiert wurden, sich beendet haben.

@carsten_java: Lass Dich von diesem Detail bitte nicht verwirren. Ganz am Anfang wirst Du vermutlich nicht wissen, was ein Thread ist und Du wirst nichts machen, dass einen zusätzlichen Thread starten wird. Daher trifft die Aussage von temi in so einfachen Applikationen zu. Aber dennoch sind es zwei verschiedene Punkte: das return in der main Methode und das Beenden der Java Virtual Machine. Erstes ist eine Voraussetzung für das Zweite. Aber aus dem Ersten folgt das Zweite nicht.

Aber ganz wichtig ist natürlich der zweite Part: Der return Befehl beendet die Methode, in der das return steht. Und danach geht es hinter der Stelle, an der die Methode aufgerufen wurde, weiter!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Char zu einem String machen Java Basics - Anfänger-Themen 1
D String und char in String speichern Java Basics - Anfänger-Themen 5
R String in char-Array übertragen Java Basics - Anfänger-Themen 5
I char Array to String Java Basics - Anfänger-Themen 3
C Methoden String in char Array Java Basics - Anfänger-Themen 3
C char in String suchen und durch anderen String ersetzen Java Basics - Anfänger-Themen 2
T Object zu Char zu String Java Basics - Anfänger-Themen 6
W String auf char[] umwandeln Java Basics - Anfänger-Themen 3
C String-zaehleZeichen(String str,char[]c) Java Basics - Anfänger-Themen 9
D Best Practice String aufbau - Char Array oder Anhängen Java Basics - Anfänger-Themen 11
P Char aus einem String auswählen Java Basics - Anfänger-Themen 4
E Input/Output convert string to two dimensional char and output = matrix Java Basics - Anfänger-Themen 2
P Datentypen String auf JTextField wird zu Char-Array und anschließend zu int Java Basics - Anfänger-Themen 12
M String in char-weise vergleichen und ausgeben Java Basics - Anfänger-Themen 5
S Datentypen Ein String in ein Char und ein Double wandeln Java Basics - Anfänger-Themen 2
A Char to String Java Basics - Anfänger-Themen 5
M String( char[] value ) Java Basics - Anfänger-Themen 3
U Fragen zu String und Char Java Basics - Anfänger-Themen 10
S expected java.lang.string but found char Java Basics - Anfänger-Themen 5
B Char in String ersetzen Java Basics - Anfänger-Themen 15
N Methode die String in char-Array wandelt!! Java Basics - Anfänger-Themen 11
D Erste Schritte String Array in char Array umwandeln? Java Basics - Anfänger-Themen 1
E Char-Array zu String Java Basics - Anfänger-Themen 2
M Datentypen Char Array in String Array gibt Probleme Java Basics - Anfänger-Themen 10
C String ab einem bestimmten Char abschneiden??? Java Basics - Anfänger-Themen 7
H String zerlegen in einzelne Buchstaben (char)?? Java Basics - Anfänger-Themen 7
B Datentypen char, int, float in String Variable speichern Java Basics - Anfänger-Themen 4
V Zahleneingabe als String in Char umwandeln Java Basics - Anfänger-Themen 4
I char arrays zu string Java Basics - Anfänger-Themen 7
L String zuverlässig nach Char parsen? Java Basics - Anfänger-Themen 4
B Unterschied zwischen String & char Array? Java Basics - Anfänger-Themen 5
Luk10 String in ein char[] schreiben Java Basics - Anfänger-Themen 5
H string/char to keycode Java Basics - Anfänger-Themen 7
K String in Char umwandeln ??? Java Basics - Anfänger-Themen 2
B Datentypen Char Array in einen String verwandeln? Java Basics - Anfänger-Themen 2
W Char in String parsen Java Basics - Anfänger-Themen 6
K String von z.B. "\u003C" in Char konvertieren Java Basics - Anfänger-Themen 7
N string in char und char in int Java Basics - Anfänger-Themen 6
S String in Char umwandeln Java Basics - Anfänger-Themen 9
hdi char[] to String Java Basics - Anfänger-Themen 4
J String in char Array Java Basics - Anfänger-Themen 2
G länge von string, string aus integer/char Java Basics - Anfänger-Themen 6
A Datentyp String in char umwandeln Java Basics - Anfänger-Themen 3
N String/char-array aus datei auslesen Java Basics - Anfänger-Themen 2
A String to Char Umwandlung. Java Basics - Anfänger-Themen 7
J Lesen einer Datei in einen String oder Char? Java Basics - Anfänger-Themen 3
M Char Array mit Sonderzeichen in String umwandeln Java Basics - Anfänger-Themen 21
T String als Array und Umwandlung in Char Java Basics - Anfänger-Themen 7
0 String in Char umwandeln ? Java Basics - Anfänger-Themen 3
G Char in String umwandeln Java Basics - Anfänger-Themen 14
X char to String Java Basics - Anfänger-Themen 3
S String in char umwandeln Java Basics - Anfänger-Themen 7
S char in String umwandeln? Java Basics - Anfänger-Themen 11
G String[] in char? Java Basics - Anfänger-Themen 3
S String / charAt + Fehlermeldung: char cannot be dereferenced Java Basics - Anfänger-Themen 16
L char in String Java Basics - Anfänger-Themen 10
G Frage zu Umwandlung char[] in string[] bzw. Schleifen Java Basics - Anfänger-Themen 9
H char Array in String Java Basics - Anfänger-Themen 7
S String in char-Array einfügen Java Basics - Anfänger-Themen 8
G String: nach 3. Zeichen char ersetzen Java Basics - Anfänger-Themen 3
C KeyCode (Char(22)) in einem String Java Basics - Anfänger-Themen 7
G zwei Zahlen bei String.valueOf(char c) in JTextField Java Basics - Anfänger-Themen 7
B Char in String ? Java Basics - Anfänger-Themen 2
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
R Ein Multidimensionales String Array initialisieren und Deklarieren Java Basics - Anfänger-Themen 2
H String Repräsentation eines Rechtecks mit Instanz-Methode Java Basics - Anfänger-Themen 8
Dorfschmied Kartesisches Produkt von zwei Liste mit Hashmaps<String,String> erstellen Java Basics - Anfänger-Themen 4
S String mit Int input vergleichen Java Basics - Anfänger-Themen 5
B Anzahl Nullen uns Einsen in String ermitteln Java Basics - Anfänger-Themen 3
T Leerzeichen im String entfernen Java Basics - Anfänger-Themen 6
Jose05 Nullpointerexception bei Umwandlung von String zu int Java Basics - Anfänger-Themen 2
O Ich habe einen String und soll mit matches schauen, ob ein Buchstabe zu einer geraden ANzahl im String vorkommt, wie soll das gehen? Java Basics - Anfänger-Themen 7
M String beim einlesen formatieren Java Basics - Anfänger-Themen 12
N null in String replacen Java Basics - Anfänger-Themen 16
R Compiler-Fehler JTable mit XML befüllen | The constructor JTable(Object[], String[]) is undefined Java Basics - Anfänger-Themen 10
M Eclipse kennt keine String Klasse mehr Java Basics - Anfänger-Themen 1
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
V String mit int multiplizieren? Java Basics - Anfänger-Themen 16
H Überprüfen ob String Array leer ist Java Basics - Anfänger-Themen 4
A Korrigierte <String> Liste zurückgeben Java Basics - Anfänger-Themen 22
C In String, Buchstaben ersetzen durch andere Buchstaben Java Basics - Anfänger-Themen 26
Poppigescorn String mit mehreren Wörtern füllen? Java Basics - Anfänger-Themen 4
I String Expression mit Java validieren (true / false) Java Basics - Anfänger-Themen 34
B String - Wörter finden, welches Punkt und entsprechender Pre / Suffix hat? Java Basics - Anfänger-Themen 30
T Maximale Anzahl von Konsonanten im String Java Basics - Anfänger-Themen 6
H String verschlüsseln - eigener Algorithmus Java Basics - Anfänger-Themen 104
N Aus einem String die Anzahl der Vokale auslesen Java Basics - Anfänger-Themen 40
J Eintrag Combobox über einen String auswählen Java Basics - Anfänger-Themen 3
K mit String.splitt(",") ganzen Satz erhalten? Java Basics - Anfänger-Themen 3
K Wie String prüfen ob drei mal das gleiche Zeichen vorkommt? Java Basics - Anfänger-Themen 7
I Validation, ob String ein Wert aus einem Enum enthält Java Basics - Anfänger-Themen 3
A ObservableList<String> Java Basics - Anfänger-Themen 6
I String nach Wort suchen Java Basics - Anfänger-Themen 6
I String ersetzen, der Inhalt enthält Java Basics - Anfänger-Themen 4
L ArrayList<String> --> double[] array Java Basics - Anfänger-Themen 18
J Variablenzugriff über string Java Basics - Anfänger-Themen 18
Flo :3 Variablen Type dismatch: cannot convert from string to int Java Basics - Anfänger-Themen 9
T Problem mit Lehrzeichen und String bei einfacher Chiffre Java Basics - Anfänger-Themen 8
P String zu int konvertieren nur mit charAt Java Basics - Anfänger-Themen 8
elsaaaaaa Wochentag als String ausgeben mit JDK Klassen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen


Oben