Java,生成一个文本

Java,生成一个文本,java,string,hashtable,stringbuffer,Java,String,Hashtable,Stringbuffer,我的程序有一部分有问题。下面的代码27是我们字母表中的字母数;list_extended是Hashtable(StringBuffer,Integer)类型的对象集,包含文本中长度为n+1的所有字符串以及出现次数;扩展列表是正确构建的,因为我已经控制了此部分。其目的是:对于外部for的每次重复,我们取生成的文本的最后n个字符,对于字母表的每个字母,我们计算通过将字符添加到生成的文本的最后n个字符中而获得的n+1个字符在列表中的出现次数;然后我们选择出现次数最多的字母。我得到的结果是引用包含所有0

我的程序有一部分有问题。下面的代码27是我们字母表中的字母数;list_extended是Hashtable(StringBuffer,Integer)类型的对象集,包含文本中长度为n+1的所有字符串以及出现次数;扩展列表是正确构建的,因为我已经控制了此部分。其目的是:对于外部for的每次重复,我们取生成的文本的最后n个字符,对于字母表的每个字母,我们计算通过将字符添加到生成的文本的最后n个字符中而获得的n+1个字符在列表中的出现次数;然后我们选择出现次数最多的字母。我得到的结果是引用包含所有0,为什么?代码

        int index;
        int[] occurrences = new int[27];
        StringBuffer curr_word;
        for(int x = 0; x < m; x++){   // m is the number of characters the user wants to add
            curr_word = new StringBuffer(text_generated.substring(x, x+n)); // n is an integer entered previously, initially text_generated is formed by n characters
            for(int j = 0; j < 27; j++){
                if(list_extended.get(curr_word.append(array[j]))==null)
                    occurrences[j] = 0;
                else
                    occurrences[j] =(int) list_extended.get(curr_word.append(array[j]));
            }
            index = 0;
            for(int j = 1; j < 27; j++){
                if(occurrences[j] > occurrences[index])
                    index = j;
            }   
            text_generated = text_generated.append(array[index]);
        }
                    System.out.println("The text generatd is \n" + text_generated.toString());
int索引;
int[]出现次数=新的int[27];
StringBuffer curr_单词;
for(int x=0;x出现次数[index])
指数=j;
}   
text_generated=text_generated.append(数组[索引]);
}
System.out.println(“文本generatd是\n”+text_generated.toString());

因为您创建了新对象
curr\u word
,但没有将其放入扩展的
列表中,所以每次检查

if(list\u extended.get(curr\u word.append(array[j]))==null)

null


出现次数[j]
0

是因为您没有增加索引吗?像这样的代码很难看穿。你指的是哪个索引?首先,你需要使用一个不可变的类,而不是
StringBuffer
。所以使用
String
作为HashMap中的键。为什么?因为当您使用可变对象作为键时,一旦键的值更改,您将找不到该值!现在,您要求Peter告诉您多线程程序已经告诉您的内容。使用
Map
并使用
Map.get(stringBuilder.toString())
list\u extend是另一个文本的n+1个字符字符串的出现列表,而不是生成的文本;除了curr\u单词的长度是n,而不是n+1,这就是问题所在,您创建了新的StringBuffer,但它不在list\u extend中,因此您无法在list\u extend中找到它,实际上您需要检查的是字符串本身,而不是StringBuffer。为什么不将列表扩展更改为哈希表?