2
String a ="the STRING TOKENIZER CLASS ALLOWS an APPLICATION to BREAK a STRING into TOKENS.  ";

StringTokenizer st = new StringTokenizer(a);
while (st.hasMoreTokens()){
  System.out.println(st.nextToken());

上記のコードを指定すると、出力は次のようになります。

the
STRING TOKENIZER CLASS
ALLOWS
an
APPLICATION
to
BREAK
a
STRING
into
TOKENS. 

私の唯一の質問は、なぜ「STRING TOKENIZER CLASS」が 1 つのトークンにまとめられたのか????????

このコードを実行しようとすると、

System.out.println("STRING TOKENIZER CLASS".contains(" "));

それは面白い結果を出力しました、

間違い

論理的に聞こえませんか?何がうまくいかなかったのかわかりません。

何故かJavaがスペースを有効なスペースと認識していなかったのが原因でした。でも、前処理から載せたコードまでどうしてこうなったのかはわかりません。

みんな、強調する必要があるのは、以下のコードが上記のコードの前に最初に実行される..

if (!suspectedContentCollector.isEmpty()){ イテレータ i = expectedContentCollector.iterator(); 文字列 temp=""; while (i.hasNext()){ temp+=i.next().toLowerCase()+ " "; } StringTokenizer st = 新しい StringTokenizer(temp);

        while (st.hasMoreTokens()){
            temp=st.nextToken();
            temp=StopWordsRemover.remove(temp);
            analyzedSentence = analyzedSentence.replace(temp,temp.toUpperCase());
        }
    }

したがって、大文字に変更すると、どこかで何かがうまくいかなかったようで、特定のスペースだけが認識されないことに気付きました。ドキュメントからテキストを取得する理由はありますか?

次のコード、

String a ="STRING TOKENIZER クラスは、アプリケーションが STRING を TOKENS に分割することを許可します。"; for (int i : a.toCharArray()) { System.out.print(i + " "); }

次の出力が生成され、

116 104 101 32 83 84 82 73 78 71 160 84 79 75 69 78 73 90 69 82 160 67 76 65 83 83 32 65 76 76 79 87 83 32 97 110 32 65 80 80 76 73 67 67 65 84 73 111 32 66 82 69 65 75 32 97 32 83 84 82 73 78 71 32 105 110 116 111 32 84 79 75 69 78 83 46 160 32

4

5 に答える 5

6

そこ -- 答えは、追加したスニペットにあります。リストされている整数は、単語 STRING の後のスペース が、通常のスペースである文字 32 ではなく、ASCII 文字 160 であることを示しています。元の文字列を編集して、STRING TOKENIZER CLASS 内のスペースをシフト スペースではなく実際のスペースに置き換えます。

1.4.2 Javadoc からのちょっとしたコメント:

StringTokenizer新しいコードでの使用は推奨されていませんが、互換性のために保持されているレガシー クラスです。この機能を求める人は、代わりにStringまたは java.util.regexパッケージの分割メソッドを使用することをお勧めします。

于 2010-03-22T18:15:59.920 に答える
5

文字コードを見ると、問題の「スペース」は 0xA0 であり、改行しないスペースを意図しています。「STRING TOKENIZER CLASS」が1単語として扱われるように意図的に入力されたのではないかと思います。

解決策 ('STRING TOKENIZER CLASS' を 3 つの単語に分割することが正しいと思われる場合) は、改行しないスペースを区切り文字として StringTokenizer クラス (または String.split() メソッド) に追加することです。例えば

  new StringTokenizer(string, " \t\n\r\f\240")
于 2010-03-22T19:02:58.420 に答える
3

「STRING TOKENIZER CLASS」で通常のASCIIブランク以外のものを使用している可能性はありますか? シフトキーを押したまま、代わりにシフトスペースを入れたのではないでしょうか?

于 2010-03-22T18:15:16.727 に答える
2

Do us all a favor and copy and paste the output of this snippet:

    for (int i : a.toCharArray()) {
        System.out.print(i + " ");
    }

OK, now looking at the output, it confirms what we've all been suspecting: those "spaces" are ASCII 160, the &nbsp non-breaking space. It's a different character from the ASCII 32 regular space.

トークナイザー (他の人が言ったように廃止されました) に ASCII 160 を区切り文字として含めることができます。または、そもそもそこにあると想定されていない場合は、入力文字列から除外することもできます。

今のところ、a = a.replace((char) 160, (char) 32);トークン化する前は簡単な修正です。

于 2010-03-22T18:24:05.003 に答える
1

Web ページまたは Word 文書から文をコピーして貼り付けた場合、スペースの代わりにいくつかの特殊文字が含まれている可能性があります (例: 非改行スペースなど)。Java エディタで文を入力して、もう一度試してください。

于 2010-03-22T18:16:10.920 に答える