12

単語に I、O、S、H、X などの一連の文字のみが含まれているかどうかを確認しようとしています。ユーザーが次のように入力するとします: SSHX、出力は yes になりますが、ユーザーが SHEXX と入力すると、出力は NO になります。

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

5 に答える 5

13

あなたはそれを解決する良い方法を持っています。問題は、実際には各文字をチェックしていないため、for ループ内でチェックを行う必要があるか、最後の文字のみをチェックすることです。ただし、すべての文字が「はい」の場合にのみ印刷する必要があるため、「はい」を印刷することはできません。そのため、ブール値を使用してそれを確認することもできます。

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

しかし、他の人が指摘しているように、正規表現を使用する方が効果的です (そして、これはあなたが望むものに対して機能する正規表現を持っています..アスタリスクは、括弧内にあるものがゼロ以上であることを意味します。):

    if (word.matches("[HIOSX]*")) {
        System.out.print("YES");
    } else {
        System.out.print("NO");
    }
于 2013-03-20T00:10:35.387 に答える
5

正規表現を使用します。

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

いくつかの追加リソース:

于 2013-03-20T00:03:32.540 に答える
5

正規表現を使用するという明白な答えは別として、Google の Guava APIを使用してこれを非常に簡単にすることを検討してください。

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

} ...
于 2013-03-20T00:07:01.173 に答える
3

正規表現を使用します。

if (word.matches("[HIOSX]+"))
    System.out.println("YES");
else
    System.out.println("NO");
于 2013-03-20T00:03:26.847 に答える
0

まず最初に、次のように文字を初期化する必要があります: char letter = '0';for ループの 0 秒の代わりに、このコードを試してください:

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

これで、ループは文字列をループし、各文字がセット内にあるかどうかを確認し、そうでない場合はループが終了し、ブール値が false に設定され、NO 出力になります

于 2013-03-20T00:12:35.700 に答える