2013-03-19 8 views
8

Próbuję sprawdzić, czy słowo zawiera tylko zestaw liter, takich jak I, O, S, H i X Załóżmy, że użytkownik wprowadza: SSHX, wynik będzie być tak, ale jeśli użytkownik wprowadzi SHEXX, wyjście będzie NOSprawdź, czy ciąg zawiera tylko zestaw liter

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

regex jest Najprostsze rozwiązanie, ale jeśli chcesz się dowiedzieć, dlaczego twój nie działa, to dlatego, że nie testujesz niczego w pętli 'for'. Możesz to zobaczyć w debugerze. – rob

Odpowiedz

11

Masz dobry sposób na rozwiązanie tego problemu. Problem polega na tym, że właściwie nie sprawdzasz każdej litery, więc musisz wykonać kontrole wewnątrz pętli for lub sprawdzisz tylko ostatnią literę. Ale wtedy nie można wydrukować „TAK”, jak tylko chcesz wydrukować go, jeśli wszystkie litery są tak, aby można było wykorzystać wartość logiczną, aby sprawdzić, jak również, jako takie:

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"); 
    } 

Ale, jak inni zwrócili uwagę stosując wyrażenie regularne jest bardziej skuteczny (i ten ma regex pracy dla tego, co chcesz .. gwiazdka oznacza zero lub więcej, co jest wewnątrz nawiasów.):

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

Dzięki @Pescis! –

2

użyć wyrażenia regularnego:

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

Twoje wyrażenie regularne będzie pasowało tylko do napisu o długości jednego znaku (który rzeczywiście powinien należeć do wymienionych). Musisz dodać '*', aby pasowało do słów wieloliterowych. –

+0

Dzięki. W rzeczywistości powinno to być '+', aby zapobiec dopasowywaniu pustych ciągów. – EJP

4

użyć 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); 
} 

Niektóre dodatkowe zasoby:

+0

* Skopiuj wklejony komentarz z drugiej odpowiedzi: * Twoje wyrażenie regularne będzie pasowało tylko do ciągu znaków jednego znaku (który rzeczywiście powinien być jednym z wymienionych). Musisz dodać '*', aby pasowało do słów wieloliterowych. –

+0

Jeśli zauważysz, jako pierwszy odpowiedziałem. Dzięki za radę. – syb0rg

+0

Nie zauważyłem, przepraszam ... część "kopiuj/wklej" jest dla drugiej odpowiedzi wtedy :) :) –

5

Oprócz oczywistej odpowiedzi z użyciem wyrażeń regularnych, należy rozważyć użycie Google Guava API aby to bardzo proste le:

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

} ... 
+1

Myślę, że chcesz to na odwrót: 'CharMatcher.anyOf ("HIOSX"). MatchesAllOf (słowo) ' –

+0

Zauważono, brak kawy dzisiaj .. –

0

przede wszystkim powinien zainicjować taki list: char letter = '0'; zamiast 0 sekunda całej twojej pętli for jest źle używana spróbuj tego kodu:

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"); 
    } 

Teraz pętla pętla nad ciągiem i sprawdzić, czy każda postać jest w zestawie, jeśli isnt końce pętli i logiczna jest ustawiona na false, co powoduje, że nie ma wyjścia