StringTokenizer标记化问题

时间:2010-03-22 18:11:41

标签: java stringtokenizer

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”被合并为一个标记?????????

当我尝试运行此代码时,

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

它打印出有趣的结果,

FALSE

这听起来不合逻辑吗?我不知道出了什么问题。

我发现了原因,Java不知何时将空间识别为有效空间。但是,我不知道从正面处理到我发布的代码,它是如何形成的。

伙计们,我需要强调的是,下面的代码首先在上面的代码之前运行..

if(!suspContentCollector.isEmpty()){             Iterator i = suspContentCollector.iterator();             String temp =“”;             while(i.hasNext()){                 temp + = i.next()。toLowerCase()+“”;             }             StringTokenizer st = new StringTokenizer(temp);

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

因此,一旦它被改为大写,某些地方似乎出现了问题,我意识到只有某些空间无法识别。这可能是从文档中检索文本的原因吗?

以下代码,

字符串a =“STRING TOKENIZER CLASS允许应用程序将一个字符串分成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 65 84 73 79 78 32 116 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

5 个答案:

答案 0 :(得分:6)

那里 - 答案就在你添加的片段中。列出的整数表示STRING一词后面的空格是ASCII字符160,即 ,而不是字符32,这是普通空格。编辑原始字符串,用实际空格而不是移位空格替换STRING TOKENIZER CLASS中的空格。

来自1.4.2 Javadoc的旁注:

  

StringTokenizer是一个遗留类   因兼容性原因而保留   虽然在新的情况下不鼓励使用它   码。任何人都可以推荐   寻求此功能使用   String的分割方法   而是java.util.regex包。

答案 1 :(得分:5)

查看字符代码,所讨论的'空格'是0xA0,它意图是一个不间断的空间。我的猜测是它是故意输入的,所以'STRING TOKENIZER CLASS'被视为一个单词。

解决方案(如果你认为将'STRING TOKENIZER CLASS'分成三个单词确实是正确的)将通过将非中断空格作为分隔符添加到StringTokenizer类(相应的String.split()方法) )。 E.g。

  new StringTokenizer(string, " \t\n\r\f\240")

答案 2 :(得分:3)

你有可能在“STRING TOKENIZER CLASS”中使用除正常ascii空白以外的东西吗?也许你按住了shift键并在那里得到了一个移位空间?

答案 3 :(得分:2)

请帮助我们,并复制并粘贴此代码段的输出:

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

好的,现在查看输出,它确认了我们一直怀疑的东西:那些“空格”是ASCII 160,&nbsp不间断的空间。它与ASCII 32常规空间不同。

您可以让令牌器(其他人已经说过了)将ASCII 160作为分隔符包含在内,或者如果首先不应该将它从输入字符串中过滤掉,则可以将其过滤掉。

目前,{token}之前的a = a.replace((char) 160, (char) 32);是一个快速解决方法。

答案 4 :(得分:1)

如果您从网页或Word文档中复制/粘贴该句子,则可能会有一些特殊字符而不是空格(例如:不间断空格等)。 在Java编辑器中输入句子再试一次。