我有一个程序,我正在尝试制作马尔可夫文本生成器。我计划以设定的间隔分割一些文本,然后将其存储到一个类中。我不知道如何解决的问题是如何处理命名我将要进行的类的实例。我打算在for循环中生成实例。用户将传递该方法一定量的文本(其长度事先未知)。下面的伪代码:
create vector for sets and tail letter;
for (int c = 0; c < text.length; c++) {
Check to make sure overflow doesnt happen;
Create instance of set named c;
store set and tailLetter into vector;
}
public class set {
String characters;
char tailLetter;
}
如果不够清楚,我很抱歉。我正在自学Java,这是我在这里的第一篇文章。
答案 0 :(得分:4)
如果您正在学习Java,我建议您首先关注如何使用Java的类和方法对问题进行建模。
马尔可夫链是种子文本的模型或统计细节,对吧?使用它来模拟文本,它通常描述每个单词在每个单词后面跟随的频率。 (通常你会在文字边界上分割文字)。感觉它需要一堂课;它可能被称为MarkovChain
。
在MarkovChain类中,您需要一些东西来保存文本中出现的每个单词,并将该单词映射到文本中的其他单词,以及其他单词的频率计数。
假设单词是'和'。在文本中,'和'后面跟着“the”四次,然后是“then”3次。所以你需要一些数据结构来保存这样的东西:
and -->
the (4)
then (3)
一种方法是使用ArrayList来保存所有单词,然后使用Map<T1,T2>
来保存单词与后续单词频率之间的关系。
在这种情况下,T1可能是一个字符串,T2可能是对的ArrayList - 字符串和该字符串的(整数)计数。
但是等等,现在你不需要基础ArrayList<>
来存储单词,因为它们只是地图中的键。
......等等。下一步是弄清楚如何填充该数据结构。这可能是一个内部(私有)方法,当调用者使用种子文本实例化MarkovChain类时会调用它。
可能你也希望MarkovChain类公开另一个方法,一个公共方法,调用者在想要从链中生成一些随机序列时调用,依赖于基于频率计数的概率。
...
这只是考虑问题建模的一种方式。
无论如何,在编写代码之前,我会专注于建模/设计练习。
答案 1 :(得分:3)
您是否可以使用密钥为生成名称的Map<String, Set>
?
答案 2 :(得分:0)
您可以使用ArrayList来管理实例。我更喜欢Map的想法,因此您可以动态设置名称,而不是尝试通过索引号访问实例。
答案 3 :(得分:0)
我没有看到名字的重点:
如果它们只是为了让'set'对象有一些不同的字符串用于调试,那么默认的toString()
实现将为您提供。
如果您特别需要查找这些“set”对象,那么数字标识符或序列号将更好用。
如果你解释了这些名字的目的,以及你打算如何使用它们,也许我们可以给你更好的建议。