0

さて、私はこれについて別の質問をして解決しましたが、ここで私がやりたいことの簡単な説明があります: テキストファイルからテキストをトークンとして抽出できるようにしたい - たとえば、次の文を含むテキスト ファイル:

いいお店です、

私を信じてください!

これの内容を「トークン」として抽出したい - たとえば、1 つのトークンは「It's」、次のトークンは「 」、その次のトークンは「a」、「 」、「good」の順になります。 、「レストラン」、「、」、「\n」、「信じる」、「」、「私」、「!」の順に続きます。つまり、トークンは単語であるか、単語ではないかのいずれかであるというのが 1 つの言い方だと思います。

これまでの私のコードは次のとおりです。

/**
* Returns the next token, or throws a NoSuchElementException if none remain.
*/
public Token next() {
  if (c == -1) {
        throw new NoSuchElementException();
    }

  Writer sw=new CharArrayWriter();
  boolean trf=false;
  try {
        while ( c != -1 && isWordCharacter(c) ) {
                sw.write(c);
                c = r.read();
                trf=true;
        }
        while ( c != -1 && !isWordCharacter(c)) {
            if (Character.isWhitespace(c)&&!(trf==true)){
                sw.write(c);
                c=r.read();
                }
            else if (Character.isWhitespace(c)&&(trf==true)){
                c=r.read();
            }
            else{
                sw.write(c);
                c = r.read();

            }
        }
    } catch (IOException e) {
        c = -1;
        return new Token(trf, sw.toString());
    }
    return new Token (trf, sw.toString());
} 

問題は、空白をスキップすることです。そのため、「It's」、「」、「a」、「」、「good」などを取得する代わりに、空白を取り込まずに「It's」、「a」、「good」を取得します。トークン。誰が何が間違っているかのヒントを持っていますか? ありがとうございました!

4

2 に答える 2

0

ただ行う:

StringTokenizer str = new StringTokenizer(sentence);
ArrayList<String> arr = new ArrayList<String>();
while(str.hasMoreTokens())
{
    //arr.add(" "); Be careful to add this only after the first word
    arr.add(str.nextToken());
}

" "すべてのトークンの後に含めるロジックを追加します。とてもシンプルです;)

于 2012-04-10T02:35:34.543 に答える
0

ここに参照へのリンクがあります。
StringTokenizer(String str, String delim, boolean returnDelims)

最後の引数が示唆するように、区切り文字も返します。

StringTokenizer str = new StringTokenizer(sentence," \n\r",true);

while(str.hasMoreTokens())
{
    System.out.println(str.nextToken());
}

これにより、必要なものが得られるはずです。それが役に立てば幸い。

于 2012-04-10T03:09:39.190 に答える