我一直在基于Markov Chains构建名称生成器。到目前为止,代码可以找到下一个字母的概率并将其很好地放置在名为LinkedHashMap
的{{1}}的{{1}}(我将在这一点以后称为LHM)上,方法是使用states
功能。 LHM存储数据,因此第一个键是状态,第二个键是过渡字母。
但是,这是开始变得有趣的地方。我有三个输出语句,一个在generateProbabilities()
函数中,两个在generate()
init中。这是我的输出:
编辑部分:
WeightedRandom
奇怪的是,第14行的NPE是Called from generate(): [0.13333333333333333, 0.13333333333333333, 0.13333333333333333, 0.06666666666666667, 0.13333333333333333, 0.06666666666666667, 0.06666666666666667, 0.13333333333333333, 0.06666666666666667, 0.06666666666666667]
Called from WeightedRandom (Size): 10
Called from WeightedRandom (Values): [0.13333333333333333, 0.13333333333333333, 0.13333333333333333, 0.06666666666666667, 0.13333333333333333, 0.06666666666666667, 0.06666666666666667, 0.13333333333333333, 0.06666666666666667, 0.06666666666666667]
Exception in thread "main" java.lang.NullPointerException
at WeightedRandom.<init>(WeightedRandom.java:14)
at MarkovChain.generate(MarkovChain.java:102)
at Temp.main(Temp.java:7)
中的第二个println语句,它在打印出数据后被抛出。第三个println打印没有错误。因此,这并不是像我忘记初始化它,或者没有正确的密钥来获得NPE。代码如下:
MarkovChain.java
WeightedRandom
WeightedRandom.java
public class MarkovChain {
public String filePath;
public LinkedHashMap<String,LinkedHashMap<String,Double>> states = new LinkedHashMap<String,LinkedHashMap<String,Double>>();
public MarkovChain(String filePath){
this.filePath = filePath;
}
public void generateProbabilities(String delimiter){
//Creates a hashmap of probabilities for each letter.
}
public String generate(int iterations){
Random rand = new Random();
LinkedHashMap<String,Double> currProbabilities = states.get("a"); // Placeholder for random start state;
String output = "";
WeightedRandom weightRand;
System.out.println("Called from generate(): " + currProbabilities.values());
for(int i = 0; i<iterations; i++){
weightRand = new WeightedRandom(currProbabilities);
String newState = weightRand.compute();
output+=newState;
currProbabilities = states.get(newState);
}
return output;
}
}