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

Java-马尔可夫链文本生成器-解析文本文件,java,parsing,for-loop,while-loop,markov-chains,Java,Parsing,For Loop,While Loop,Markov Chains,我需要使用“双城记”的纯文本文件为我的算法类创建一个马尔可夫链文本生成器(由古腾堡项目提供)。我目前停留在第一个阶段,即通过文本文件进行解析,并从字符中生成键值对,以便将它们添加到符号表中,以便完成其余工作(实际生成新文本) 为了澄清,这就是我想要的键值对(假设字母表是文本文件): abc=键| d=值 bcd=键| e=值 cde=键| f=值 等等 我使用BufferedReader读取每一行,然后解析每一行,但我这样做的方式是错误的,我无法找到解决方法。为了迭代每行中的字符,我使用fo

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

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

  • abc=键| d=值
  • bcd=键| e=值
  • cde=键| 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 *
         ******************/
    }
}
导入java.io.BufferedReader;
导入java.io.IOException;
公共类MarkovTextGenerator{
公共静态void main(字符串[]args)引发IOException{
/***********************************************************
*通过文本文件逐个字符开始解析*
***********************************************************/
try(BufferedReader br=newbufferedreader(newfilereader(“file.txt”)){
弦线;
而((line=br.readLine())!=null){
对于(int i=0;i
for循环的迭代应该只转到
i
。引发
StringIndexOutOfBounds
异常,因为
行.substring
调用将超过字符串的最后一个字符

比如说


“abc”。子字符串(2,3)
将引发异常,因为字符串后面没有更多的字符。

如果行有三个或更少的字符,请不要忘记添加特殊处理(如果检查
i
line.length(),则根本不会执行循环)
返回一个值
谢谢Niels!这就成功了。另外,感谢@sina!这是一件需要记住的重要事情。但是,我不会在我的特定程序中遇到这个问题,所以我不需要担心它。