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:

[CODE lang="java" title="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;
}
}
[/CODE]

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
 
K

kneitzel

Gast
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?
 
K

kneitzel

Gast
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:

carsten_java

Mitglied
Also, wenn ich eine return-Anweisung in eine Schleife schreibe und die Bedingung für dieses return zutrifft, wird die Schleife und auch evtl. das Programm beendet?
 
K

kneitzel

Gast
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
D 2D Char Array into String Java Basics - Anfänger-Themen 2
Fats Waller Compiler-Fehler Kann ich einen String und die Summe zweier Char Werte mittels der println Anweisung ausgeben Java Basics - Anfänger-Themen 4
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
D String Groß/Kleinschreibung Ignorieren Java Basics - Anfänger-Themen 4
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
Kartoffel_1 String transformation Java Basics - Anfänger-Themen 7
H String-Operation replace() - Zeichenkette verdoppeln Java Basics - Anfänger-Themen 2
K String analysieren Java Basics - Anfänger-Themen 27
Beowend String zu Date parsen Java Basics - Anfänger-Themen 1
Beowend String auf Satzzeichen überprüfen? Java Basics - Anfänger-Themen 6
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
String in ArrayList umwandeln Java Basics - Anfänger-Themen 1
I Sass Compiler und String erhalten? Java Basics - Anfänger-Themen 7
Avalon String in Double bzw. Währung konvertieren Java Basics - Anfänger-Themen 6
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
F Arraylist<String>Ein Wort pro Zeile Java Basics - Anfänger-Themen 6
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
N String überprüfen Java Basics - Anfänger-Themen 3
E String zerlegen aus args Java Basics - Anfänger-Themen 1
M Long-Typ in String-Änderung führt zu keinem Ergebnis bei großer Zahl Java Basics - Anfänger-Themen 11
Ostkreuz String Exception Java Basics - Anfänger-Themen 8
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
J String Filter Java Basics - Anfänger-Themen 5
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Größter zusammenhängender Block gleicher Zeichen im String Java Basics - Anfänger-Themen 1
XWing Randomizer mit einem String Java Basics - Anfänger-Themen 2
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
I Zerlegen von String Java Basics - Anfänger-Themen 3
B Beliebiger String gegeben Suche Datum in String Java Basics - Anfänger-Themen 6
I String Java Basics - Anfänger-Themen 4
I API - zurückgegebener JSON String lesen und in Entity konvertieren Java Basics - Anfänger-Themen 2
H Zu langen String aufteilen - bequeme Methode? Java Basics - Anfänger-Themen 14
W String einer Textdatei in einzelne Stringobjekte pro Zeile aufteilen Java Basics - Anfänger-Themen 14
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
M Kommandozeilenparamter als EINEN String werten Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben