Однако, пытаясь разобрать слова в HashMap из входного потока (символ за символом), пробелы продолжают поступать? - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь разобрать слова из входного файла в хэш-карту, где каждое слово отображается в количество раз, которое оно встречается в файле.Я должен сделать это через символьный поток (то есть: я должен пройти файл символ за символом).Теперь это работает нормально, однако мой парсер иногда пропускает пробелы и включает в себя две слова в виде одной строки (например: themiddle, helloworld и т. Д.). Кто-нибудь может указать, что я делаю неправильно?Кроме того, есть ли в любом случае включить слова, которые имеют форму (буква / цифра). (Буква / цифра).(так что это буква, затем точка, а затем буква столько раз (сокращения в других словах, как IBM)).

Вот фрагмент моего кода

    int i; 
            while ((i=f.read()) != -1) {


              if (Character.isLetterOrDigit(i)) {
                  st += (char)i;
              }

              else  {

                  st = st.toLowerCase();

                  if (tokens.containsKey(st)) {
                      int temp = tokens.get(st);
                      tokens.put(st, temp+=1);
                  }
                  else {

                      tokens.put(st, 1);
                      st = "";
                  }

              }
          }

            tokens.remove("");
    return tokens;

}`

anyприветствуется помощь, вход является объектом чтения файлов между прочим.

1 Ответ

0 голосов
/ 31 января 2019

Это то, что устанавливает вашу строку обратно пустой:

st = "";

Таким образом, она должна быть во внешней else, а не во внутренней, в противном случае вы устанавливаете ее как пустую, только когда находите новую(не повторяется) слово.Это сделает следующее слово объединенным с предыдущим.

Что касается второй части, вы можете сделать что-то вроде

if ( Character.isLetterOrDigit(i) || (st != "" && (char)i == '.') ) {
    st += (char)i;
}

Редактировать:

А затем, чтобы удалить последний период, просто проверьте, является ли последний символ st периодом, когда он попадает в else.

Другое редактирование:

Если вы хотите ровно одну букву перед каждым периодом, вы можете проверить строку st в обратном направлении в if.Или просто обработайте его после разделения, в else.Или даже используйте Регулярные выражения .

Как вы реализуете это зависит от вас.

...