Java - 马尔可夫链文本生成器 - 解析文本文件

时间:2015-11-19 15:38:53

标签: java parsing for-loop while-loop markov-chains

我需要使用“双城记”的明文文件(由Project Gutenberg提供)为我的算法类创建马尔可夫链文本生成器。我目前停留在第一阶段,即解析文本文件并从字符中创建键值对,以便将它们添加到符号表中以执行其余工作(实际生成新文本) )。

为了澄清,这就是我想要的键值对(假设字母表是文本文件):

  • abc = key | d =值
  • bcd = key | e =值
  • cde = key | f =值
  • 等等

我正在使用BufferedReader读取每一行然后解析每一行,但我这样做的方式是错误的,我无法找到解决方法。为了遍历每一行中的字符,我使用for循环来到达当前字符,然后到达当前字符+ 1,依此类推。基本上,我最终必须到达下一行(尚未读取)并收到StringIndexOutOfBounds异常。 我需要一种方法来移动到下一行并继续迭代整个文件。

这是我到目前为止所做的:

import java.io.BufferedReader;
import java.io.IOException;

public class MarkovTextGenerator {
    public static void main(String[] args) throws IOException {
        /***********************************************************
         * Begin parsing through text file, character by character *
         ***********************************************************/
        try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                for (int i = 0; i < line.length(); i++) {
                    String char1 = line.substring(i, i + 1);
                    String char2 = line.substring(i + 1, i + 2);
                    String char3 = line.substring(i + 2, i + 3);
                    char value = line.charAt(i + 3);
                    String key = char1 + char2 + char3;
                    System.out.println(key);
                    System.out.println(value);
                }
            }
        }
        /******************
         * End of parsing *
         ******************/
    }
}

1 个答案:

答案 0 :(得分:1)

for循环的迭代应该只转到i < line.length() - 3。抛出StringIndexOutOfBounds异常是因为line.substring调用将超过字符串的最后一个字符。

例如

"abc".substring(2,3)将抛出异常,因为字符串后面不再有字符。