StringTokenizer проблема токенизации - PullRequest
2 голосов
/ 22 марта 2010
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.Но я не знаю, как это получилось, начиная с фронтальной обработки и заканчивая кодом, который я выложил.one ..

if (! suspectedContentCollector.isEmpty ()) {Iterator i = suspectedContentCollector.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());
        }
    }

Следовательно, после того, как он был изменен на UPPERCASE, что-то где-то пошло не так, и я понял, что только некоторые пробелы не были распознаны.Может ли это быть причиной извлечения текста из документа?

Следующий код,

String a = "КЛАСС СТРОК ТОКЕНИЗАТОРА ПОЗВОЛЯЕТ ПРИЛОЖЕНИЮ РАЗРЫТЬ СТРОКУ В ЖЕЛАХ.";for (int i: a.toCharArray ()) {System.out.print (i + "");}

произведено после выхода,

116 104 101 32 83 84 82 73 78 71 160 84 79 75 78 73 90 90 82 82 67 76 65 83 83 32 65 76 76 79 87 83 8332 97 110 32 65 80 80 76 73 67 65 84 73 79 78 32 116 111 32 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 83 83 46 160 32

Ответы [ 5 ]

6 голосов
/ 22 марта 2010

Там - ответ находится во фрагменте, который вы добавили.Перечисленные целые числа показывают, что пробел после слова STRING является символом ASCII 160, который является  , вместо символа 32, который является обычным пробелом.Отредактируйте исходную строку, заменив пробелы в классе STRING TOKENIZER CLASS фактическими пробелами вместо пробелов Shift.

Просто дополнительный комментарий из Javadoc 1.4.2:

StringTokenizer является устаревшим классом, который сохраняется по соображениям совместимости, хотя его использование не рекомендуется в новом коде.Всем, кто ищет эту функцию, рекомендуется вместо этого использовать метод split String или пакет java.util.regex.

5 голосов
/ 22 марта 2010

Глядя на коды символов, рассматриваемый «пробел» равен 0xA0, который предназначен для неразрывного пробела. Я предполагаю, что он был введен преднамеренно, так что «STRING TOKENIZER CLASS» рассматривается как одно слово.

Решение (если вы действительно считаете правильным разделить 'STRING TOKENIZER CLASS' на три слова) состоит в том, чтобы добавить неразрывный пробел в качестве разделителя в класс StringTokenizer (соответственно метод String.split () ). Э.Г.

  new StringTokenizer(string, " \t\n\r\f\240")
3 голосов
/ 22 марта 2010

Возможно ли, что вы используете что-то кроме обычных заготовок ascii в "STRING TOKENIZER CLASS"? Может быть, вы удерживали клавишу Shift и вместо этого получили смещенное пространство?

2 голосов
/ 22 марта 2010

Сделайте нам одолжение, скопируйте и вставьте вывод этого фрагмента:

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

Хорошо, теперь, глядя на вывод, он подтверждает то, что мы все подозревали: эти "пробелы "ASCII 160, &nbsp неразрывный пробел.Он отличается от обычного пробела ASCII 32.

Вы можете позволить токенизатору (который устарел, как говорили другие) включить ASCII 160 в качестве разделителя, или вы можете отфильтровать его из входной строки, если онне должен быть там во-первых.

На данный момент, a = a.replace((char) 160, (char) 32); до токенизации - это быстрое решение.

1 голос
/ 22 марта 2010

Если вы скопировали / вставили предложение с веб-страницы или документа Word, скорее всего, у вас есть специальные символы вместо пробелов (например, неразрывные пробелы и т. Д.).Попробуйте еще раз, набрав предложение в редакторе Java.

...