質問: str.split("[\\p{Blank}|\\.|,]++"); System.out.println( "単語数は:" + word.length ); } } ``` 追記:ご指摘いただいた皆様ありがとうございます。 The objective of the department is to perform basic scientific research and education in the field of Information Science and Engineering, whose importance as a research field is continuously increasing in recent days. In particular, applying of mathematical methodologies towards information processing and their systems, as well as exploring basic mathematical disciplines in computer science, are strongly deemed as immediate research needs. このような英文の単語の種類を知りたいです。現在の状況では、重複した単語を削除できずにいます。
回答: swordoneさんの有力候補が望ましいのかもしれませんが、一応書いておきます。 追記読みました。 まず、jahaaさん、コードじゃなくて、普通に人間として問題文を解くとするならどうしますか? コードを組む・アルゴリズムを考えるetc.のようなコンピュータからは離れているとして。 私なら、 ``` The objective of the department is to perform basic scientific research and education in the field of Information Science and Engineering, whose importance as a research field is continuously increasing in recent days. In particular, applying of mathematical methodologies towards information processing and their systems, as well as exploring basic mathematical disciplines in computer science, are strongly deemed as immediate research needs. ``` ですので、最初に The を読む。The は今のところ1回目(だって最初だし) なので The: 1 となります。 次のobjective も同様に +1 して objective: 1 になりますね。 ...and education in the field of Information... の部分で二回目のthe が出てきます。 よって、the を +1 して the: 2 とします。 これをneeds.まで行います。 これをコード化するにはどうすればいいでしょうか? まず一つ目の疑問。 「どうやって初めてかどうかがわかるか」。 二つ目の疑問。 「どうやって+1していくのか」。 ですね。 一つ目の疑問は、リスト構造か何かに入れておいて、そこにないなら「新規」、あるなら「既存」と考えられる。 そして、個数を数えるために、カウンタを用意したい。 そこで、私なら、C言語でいう構造体か、クラスを用意します。 少なくとも「データ自体」と「カウンタ」を持つクラスだとします。 一応JavaなのでできるだけOOPでやりたいなぁってことで、 私なら ``` public class Word{ // コンストラクタ public Word( String key ){ key_ = key; counter_ = 0; // 0で初期化しておく } private String key_; private int counter_; } ``` みたいにします。 でもこれではprivateなメンバは操作できないので、カウンタを操作するメンバを追加します。 (今回は) -1したり、+3 したりとかはないので、単に +1 するメソッドを追加します。 ``` public class Word{ // コンストラクタ public Word( String key ){ key_ = key; counter_ = 0; // 0で初期化しておく } // カウンタ操作系 public void up(){ counter_++; } private String key_; private int counter_; } ``` このままだとカウントだけして、結果がわからないので、結果を表示するメソッドか、get系を追加します。 (できればオブジェクト自身ができればいいんですがねぇ。) (追記2: swordoneさんからご指摘を受けました。すみません、勘違いしていました。問題文では、「単語数を調べる」ですが、私は「それぞれの単語の出現回数を調べる」だと思っていたので... **単語数のほうなら「upメソッドとかそういうの」は不要になりますね**。一応、考え方としての意味でそのままにしておきますね。) (追記2.1: 単に単語数を数えたいならクラスや構造体にする必要は...ないですね。大雑把なロジックは一緒ですが、単純に Stringのリストか配列を用意すればいいだけですし。) ``` public class Word{ // コンストラクタ public Word( String key ){ key_ = key; counter_ = 0; // 0で初期化しておく } // カウンタ操作系 public void up(){ counter_++; } // keyと tokenが一致するかどうか public bool isMatch( String token ){ return ...; // todo: ここの処理はご自分で! } // 文字列にして返す public String toResultString(){ return (key_ + ":" + counter_); } private String key_; private int counter_; } ``` としておけば、 ``` // 文字列を分解してList tokensに入れているとして。 // そして、仮に the だけを数えていくとするなら。( Word the だとして ) for( int i = 0; i < tokens.length(); i++ ){ if( the.isMatch( tokens[i] ) ){ the.up(); } } ... // ほかの処理 System.out.println( the.toResultString() ); ``` みたいにできます。 例では"the"だけですが、List words とかに入れてやっていくとか。 これはあくまで、私が何となく思いついたものです。 なので、おかしな部分もあると思います。 そこは修正してください。