summaryrefslogtreecommitdiff
path: root/RGens/src/main/java/bjc/rgens/text/markov/StandaloneMarkov.java
blob: cebf2bccc448c984b1563f4a524cadb2e8623d9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package bjc.rgens.text.markov;

import java.util.Map;

/**
 * A standalone Markov generator.
 *
 * @author bjculkin
 */
public class StandaloneMarkov {
	/* The order of the generator. */
	private int ord;

	/* The generators to use. */
	private Map<String, Markov>     hash;
	/* The initial string.    */
	private String                  first;

	/**
	 * Create a new standalone Markov generator.
	 *
	 * @param order
	 * 	The order of this generator.
	 *
	 * @param markovHash
	 * 	The generators to use.
	 *
	 * @param firstSub
	 * 	The string to start out with.
	 */
	public StandaloneMarkov(int order, Map<String, Markov> markovHash, String firstSub) {
		ord = order;
		hash = markovHash;
		first = firstSub;
	}

	/**
	 * Generate random text from the markov generator.
	 *
	 * @param charsToGenerate
	 * 	The number of characters of text to generate.
	 *
	 * @return
	 * 	The randomly generate text.
	 */
	public String generateTextFromMarkov(int charsToGenerate) {
		StringBuilder text = new StringBuilder();

		for (int i = ord; i < charsToGenerate; i++) {
			if (i == ord) {
				text.append(first);

				if (text.length() > ord) i = text.length();
			}

			String sub = text.substring(i - ord, i);
			Markov tmp = hash.get(sub);

			if (tmp != null) {
				Character nextChar = tmp.random();

				text.append(nextChar);
			} else {
				i = ord - 1;
			}
		}

		return text.toString();
	}
}