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

当我尝试运行此代码时,

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

它打印出有趣的结果,

错误的

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

我找到了原因,该空间未被Java以某种方式识别为有效空间。但是,我不知道从前端处理到我发布的代码是如何变成这样的。

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

if (!suspectedContentCollector.isEmpty()){ 迭代器 i =susspectedContentCollector.iterator(); 字符串临时=“”;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());
        }
    }

因此,一旦将其更改为大写,某处似乎出现了问题,我意识到只有某些空格未被识别。这可能是从文档中检索文本的原因吗?

以下代码,

String 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 79 75 69 78 78 73 90 69 82 160 67 76 67 76 65 83 83 83 83 32 65 76 76 76 79 87 87 83 32 97 83 32 97 110 32 65 80 80 80 80 76 76 76 73 67 67 67 67 65 84 79 79 79 79 79 78 32 78 32 78 32 78 32 78 32 78 32 78 32 78 32 78 32 78 32 78 32 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

4

5 回答 5

6

那里 - 答案在您添加的代码段中。列出的整数表明单词 STRING 之后的空格是 ASCII 字符 160,即 ,而不是字符 32,即普通空格。编辑您的原始字符串,将 STRING TOKENIZER CLASS 中的空格替换为实际空格而不是移位空格。

只是旁注,来自 1.4.2 Javadoc:

StringTokenizer是一个遗留类,出于兼容性原因保留,但不鼓励在新代码中使用它。建议任何寻求此功能的人使用 split 方法Stringjava.util.regexpackage 代替。

于 2010-03-22T18:15:59.920 回答
5

查看字符代码,有问题的“空格”是 0xA0,它是一个不间断的空格。我的猜测是它是故意输入的,因此“STRING TOKENIZER CLASS”被视为一个单词。

解决方案(如果您确实认为将 'STRING TOKENIZER CLASS' 分解为三个单词是正确的)是将不间断空格作为分隔符传递给 StringTokenizer 类(分别是 String.split() 方法)。例如

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

您是否有可能在“STRING TOKENIZER CLASS”中使用了普通 ascii 空白以外的东西?也许您按住 shift 键并在其中获得了一个 shift-space ?

于 2010-03-22T18:15:16.727 回答
2

帮我们一个忙,复制并粘贴此代码段的输出:

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

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

您可以让标记器(正如其他人所说的那样已过时)将 ASCII 160 作为分隔符包含在内,或者您可以从输入字符串中将其过滤掉,如果它本来就不应该存在的话。

目前,a = a.replace((char) 160, (char) 32);在标记化之前是一个快速修复。

于 2010-03-22T18:24:05.003 回答
1

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

于 2010-03-22T18:16:10.920 回答