我正在尝试从文本文件创建决策树。
public static BTNode<String> fileToTree (String fileName) throws IOException {
BufferedReader file = new BufferedReader(new FileReader(fileName));
BTNode<String> node = new BTNode("", null, null);
BTNode<String> answer = fileToTreeHelper(node, file);
file.close();
return answer;
}
public static BTNode<String> fileToTreeHelper (BTNode<String> node, Scanner fileScanner) throws IOException {
String line;
if(node == null){
node = new BTNode<String>(fileScanner.nextLine(), null, null);
fileToTreeHelper(node, fileScanner);
}else{
if(fileScanner.hasNext()){
if(node.isLeaf()){
node.setData(fileScanner.nextLine());
}
if(node.getLeft() == null) {
line = fileScanner.nextLine();
if(line.contains("?")) {
node.setLeft(new BTNode<String>(line, null, null));
}
if(line.contains(";")) {
node.setLeft(new BTNode<>(line,null, null));
node.setRight(new BTNode<>(fileScanner.nextLine(),null, null));
}
}
if(node.getRight() == null) {
line = fileScanner.nextLine();
if(line.contains("?")) {
node.setRight(new BTNode<String>(line, null, null));
}
if(line.contains(";")) {
node.getLeft().setLeft(new BTNode<>(line,null, null));
node.getLeft().setRight(new BTNode<>(fileScanner.nextLine(),null, null));
node.setRight(new BTNode<String>(line, null, null));
fileToTreeHelper(node.getRight(), fileScanner);
}
}
}
}
return node;
}
这是我到目前为止所拥有的;当我运行它时,决策树看起来应该是这样的:
Are you a mammal?
Are you bigger than a cat?
Kangaroo;
Mouse;
Do you live underwater?
Trout;
Robin;
但到目前为止,我得到的只是:
Are you a mammal?
Are you bigger than a cat?
Kangaroo;
--
--
有关如何执行此操作的任何帮助?我知道我需要递归调用这个函数,但这不是很好。有什么想法吗?
答案 0 :(得分:1)
我认为你的算法令人困惑,它应该是这样的:
Node node = new Node(fileScanner.nextLine())
// If the node is a question, it should have 2 subnodes with the answers / nested questions.
if(line.contains("?")){
node.setLeft(fileToTreeHelper(...));
// If there is an option that has only 1 answer, then this should have an if that
// checks if there is a ";" and then create the node or set it as null.
node.setRight(fileToTreeHelper(...));
}
// If it is not a question, then it's just an answer to a previous question and returns.
return node;
答案 1 :(得分:0)
我能够解决它。谢谢。现在工作得很好。
public static BTNode<String> fileToTree (String fileName) throws IOException {
BufferedReader file = new BufferedReader(new FileReader(fileName));
BTNode<String> node = null;
Scanner fileScanner = new Scanner (file);
BTNode<String> answer = fileToTreeHelper(fileScanner);
return answer;
}
public static BTNode<String> fileToTreeHelper (Scanner fileScanner) throws IOException {
BTNode node = null;
String line = fileScanner.nextLine();
if(line.contains("?")){
node = new BTNode<String>(line, null, null);
node.setLeft(fileToTreeHelper(fileScanner));
node.setRight(fileToTreeHelper(fileScanner));
}else{
node = new BTNode<String>(line, null, null);
return node;
}
return node;
}