2

私はUVa#494で遊んでいて、以下のコードでそれを解決することができました:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Main {    
    public static void main(String[] args) throws IOException{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while((line = in.readLine()) != null){
            String words[] = line.split("[^a-zA-z]+");
            int cnt = words.length;
            // for some reason it is counting two words for 234234ddfdfd and words[0] is empty
            if(cnt != 0 && words[0].isEmpty()) cnt--; // ugly fix, if has words and the first is empty, reduce one word
            System.out.println(cnt);
        }
        System.exit(0);
    }
}

単語を分割するために正規表現"[^a-zA-z]+"を作成したので、たとえば文字列abc..abcまたはとして分割するabc432abc必要があります["abc", "abc"]。ただし、文字列を試してみると432abc、結果として次のようになります。["", "abc"]からの最初の要素words[]は単なる空の文字列ですが、は。だけであると期待していました["abc"]。この正規表現がこの場合の最初の要素を私に与える理由がわかりません""

4

2 に答える 2

8

分割参照ページを確認してください:分割参照

セパレータの各要素は、個別の区切り文字を定義します。2つの区切り文字が隣接している場合、またはこのインスタンスの最初または最後に区切り文字が見つかった場合、対応する配列要素にはEmptyが含まれます。次の表に例を示します。

連続する区切り文字がいくつかあるため、空の配列要素を取得します

于 2012-12-29T06:33:57.293 に答える
3

単語数のカウントを出力します

public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while ((line = in.readLine()) != null) {
            Pattern pattern = Pattern.compile("[a-zA-z]+");
            Matcher matcher = pattern.matcher(line);
            int count = 0;
            while (matcher.find()) {
                count++;
                System.out.println(matcher.group());
            }
            System.out.println(count);
        }
    }
于 2012-12-29T06:59:38.447 に答える