import
java.util.ArrayList;
class
WordSet {
String str;
String type;
public
WordSet(String str, String type){
this
.str = str;
this
.type = type;
}
public
String toString(){
return
"["
+str+
","
+type+
"]"
;
}
}
class
MarkovNode {
WordSet[] word =
new
WordSet[
3
];
public
MarkovNode(WordSet wordset1, WordSet wordset2, WordSet wordset3){
word[
0
] = wordset1;
word[
1
] = wordset2;
word[
2
] = wordset3;
}
}
public
class
MarkovDictionary {
final
int
maxSentenceNum =
200
;
ArrayList<MarkovNode> dic =
new
ArrayList<MarkovNode>();
ArrayList<WordSet> tmp =
new
ArrayList<WordSet>();
public
void
add(String str, String type){
tmp.add(
new
WordSet(str, type));
if
(tmp.size() ==
3
){
dic.add(
new
MarkovNode(tmp.get(
0
), tmp.get(
1
), tmp.get(
2
)));
tmp.remove(
0
);
}
}
public
String buildSentence(){
String sen =
""
;
ArrayList<WordSet> sen3 =
new
ArrayList<WordSet>();
MarkovNode tmpNode = dic.get((
int
)(dic.size()*Math.random()));
sen3.add( tmpNode.word[
0
] );
sen3.add( tmpNode.word[
1
] );
sen3.add( tmpNode.word[
2
] );
for
(
int
i=
0
;i<maxSentenceNum;i++){
String addSen = find2Match(sen3.get(
1
).str, sen3.get(
2
).str);
if
(addSen ==
null
)
break
;
sen += sen3.get(
0
).str;
sen3.remove(
0
);
sen3.add(
new
WordSet(addSen,
""
));
}
sen += sen3.get(
0
).str + sen3.get(
1
).str + sen3.get(
2
).str;
return
sen;
}
private
String find2Match(String str1, String str2){
ArrayList<String> ansList =
new
ArrayList<String>();
for
(
int
i=
0
; i<dic.size(); i++){
if
(dic.get(i).word[
0
].str.equals(str1) && dic.get(i).word[
1
].str.equals(str2)){ ansList.add( dic.get(i).word[
2
].str ); } }
if
(ansList.size() >
0
){
return
ansList.get( (
int
)(ansList.size()*Math.random()) );
}
else
return
null
;
}
public
void
show(){
for
(
int
i=
0
; i<dic.size(); i++){
System.out.println(dic.get(i).word[
0
].toString() +
", "
+ dic.get(i).word[
1
].toString() +
", "
+ dic.get(i).word[
2
].toString());
}
}
}