试图从输入流(按字符)将单词解析为HashMap,但是,空格不断出现?

时间:2019-01-31 02:31:40

标签: java tokenize

我正在尝试将输入文件中的单词解析为哈希图,其中每个单词都映射到文件中出现的次数。我必须通过字符流来执行此操作(即:我必须逐个字符地遍历文件)。现在可以正常使用了,但是,我的解析器似乎有时会跳过空格,并将两个单词作为单个字符串包含在内(例如:它们中间,helloworld等...),有人可以指出我在做什么错吗?此外,无论如何,是否要包含(字母/数字)形式的字母(字母/数字)。 (因此,它是一个字母,然后是一个点,然后是一个字母,重复了多次(简称,例如I.B.M))。

这是我的代码段

    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;

}`

任何帮助将不胜感激,输入的是文件读取器对象btw。

1 个答案:

答案 0 :(得分:0)

这是将您的字符串重新设置为空的原因:

st = "";

因此,它应该在外部else中,而不是内部,否则,只有在找到新的(不重复的)单词时才将其设置为空。这将使下一个单词与前一个单词串联。

对于第二部分,您可以做类似的事情

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

编辑:

然后,要删除最后一个句点,只需检查st的最后一个字符是否是到达else的句点即可。

另一项修改:

如果每个周期前只需要一个字母,则可以在st中向后检查字符串if。或者只是在拆分后在else中对其进行处理。甚至使用Regular Expressions

如何实现此目标取决于您。