2013-03-19 16 views
8

Ich versuche zu überprüfen, ob ein Wort nur eine Reihe von Buchstaben wie I, O, S, H und X enthält Angenommen, der Benutzer gibt ein: SSHX, wird die Ausgabe ja, aber wenn der Benutzer SHEXX eintritt, wird der Ausgang NOÜberprüfen, ob eine Zeichenfolge nur eine Reihe von Buchstaben enthält

public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 

    String word = sc.next(); 
    word = word.toUpperCase(); 

    int length = word.length(); 
    char letter = 0; 

    for (int counter = 0; counter < length; counter++) { 
     letter = word.charAt(counter); 
    } 
    if (letter != 'I' && letter != 'O' && letter != 'S' && letter != 'H' && letter != 'Z' && letter != 'X' && letter != 'N') { 
     System.out.print("NO"); 
    } else { 
     System.out.print("YES"); 
    } 
} 
+0

A regex ist die einfachste Lösung, aber wenn Sie wissen wollen, warum Ihre nicht funktioniert, ist es, weil Sie nichts in der For-Schleife testen. Sie können dies im Debugger selbst sehen. – rob

Antwort

11

Sie haben eine gute Möglichkeit, es zu lösen. Das Problem ist, dass Sie nicht wirklich jeden Buchstaben überprüfen, also müssen Sie die Prüfungen innerhalb der for Schleife durchführen, oder Sie überprüfen nur den letzten Buchstaben. Aber dann drucken Sie können nicht die „JA“, wie Sie es nur drucken möchten, wenn alle Buchstaben ja sind, so dass Sie einen boolean Wert verwenden können, das auch zu überprüfen, wie zum Beispiel:

boolean isMatch = true; 
    for (int counter = 0; counter < strLength && isMatch; counter++) { 
     letter = word.charAt(counter); 
     if (letter != 'I' && letter != 'O' && letter != 'S' && letter != 'H' && letter != 'Z' && letter != 'X' && letter != 'N') { 
      System.out.print("NO"); 
      isMatch = false; 
     } 
    } 
    if (isMatch) { 
     System.out.print("YES"); 
    } 

Aber, wie andere haben einen regulären Ausdruck wies darauf hin, effektiver ist (und dieser eine Arbeits regex hat für das, was Sie wollen .. Das Sternchen bedeutet null oder mehr von dem, was in den Klammern ist.):

if (word.matches("[HIOSX]*")) { 
     System.out.print("YES"); 
    } else { 
     System.out.print("NO"); 
    } 
+0

Dank @Pescis! –

2

einen regulären Ausdruck verwenden:

if (word.matches("[HIOSX]+")) 
    System.out.println("YES"); 
else 
    System.out.println("NO"); 
+2

Ihre Regex wird nur einer Zeichenkette eines Zeichens entsprechen (die in der Tat zu den aufgeführten gehören sollte). Sie müssen ein '*' hinzufügen, damit es mit mehrstelligen Wörtern übereinstimmt. –

+0

Danke. Eigentlich sollte es ein '+' sein, um zu verhindern, dass leere Zeichenfolgen übereinstimmen. – EJP

4

Verwenden Sie ein regular expression.

String regex = "[OSXHI]*"; 
String string = "SOMETHING"; 
Matcher matcher = Pattern.compile(regex).matcher(string); 
if (matcher.find()) 
{ 
    String match = matcher.group(1); 
    System.out.println(match); 
} 

Einige zusätzliche Ressourcen:

+0

* Kopiere den eingefügten Kommentar von der anderen Antwort: * Deine Regex wird nur einer Zeichenkette eines Zeichens entsprechen (die tatsächlich zu den aufgelisteten gehört). Sie müssen ein '*' hinzufügen, damit es mit mehrstelligen Wörtern übereinstimmt. –

+0

Wenn Sie bemerken, war ich der erste, der antwortete. Danke für den Hinweis. – syb0rg

+0

Ich habe nicht bemerkt, sorry ... der "kopierte/eingefügte" Teil ist für die andere Antwort dann ... :) –

5

Abgesehen von den offensichtlichen Antwort von einem regulären Ausdruck verwenden, sollten Sie machen mit Googles Guava API zu Das ist ziemlich einfach le:

if(CharMatcher.anyOf("HIOSX").matchesAllOf(word)) { 

} ... 
+1

Ich denke, Sie wollen es anders herum: 'CharMatcher.anyOf ("HIOSX"). PasstAllOf (Wort) ' –

+0

Notiert, kein Kaffee heute .. –

0

allererst Sie sollte der Buchstabe wie folgt initialisiert werden: char letter = '0'; anstelle von 0 Sekunde alle Ihre for-Schleife ist schlecht verwendet, versuchen Sie diesen Code:

boolean isInSet; 
    for (int counter = 0; counter < strLength; counter++) 
    { 
     letter = word.charAt(counter); 
     if (letter != 'I' && letter != 'O' && letter != 'S' && letter != 'H' && letter != 'Z' && letter != 'X' && letter != 'N') 
     { 
      isInSet=false; 
      counter=strlength; //end loop 
     } 
     else 
     { 
      isInSet=true; 
     } 
    } 
    if(isInSet=true) 
    { 
     System.out.print("YES"); 
    } 
    else 
    { 
     System.out.print("NO"); 
    } 

Nun wird die Schleife Schleife über die Zeichenfolge und prüfen, ob jedes Zeichen in dem Satz ist, wenn es die Schleifenenden und die Boolesche ist nicht auf false gesetzt, die in dem NO Ausgabeergebnisse

Verwandte Themen