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