2013-11-21 3 views
0

Итак, я кодировал базовое двоичное дерево в Java и столкнулся с проблемой. Цель этой программы - «изучить» новые вопросы, чтобы угадать животное, подобное 20 вопросам. Однако я понятия не имею, как «сохранить» узел, чтобы он мог быть вызван этим же классом при следующем запуске. Какие-нибудь советы или примеры того, как это сделать? (Кроме того, если вы видите какие-либо другие ошибки рева, не стесняйтесь критиковать/комментарий)Как сохранить узел

public class LearningTree { 
Node root; 

public void addNode(double key, String name){ 
    Node newNode = new Node(key, name); 

    if (root == null){ 
     root = newNode; 
    } else { 
     Node focusNode = root; 

     Node parent; 

     while(true){ 
      parent = focusNode;`enter code here` 

      if(key < focusNode.key){ 
       focusNode = focusNode.leftChild; 

       if(focusNode == null){ 
        parent.leftChild = newNode; 
        return; 
       } 
      } else { 
       focusNode = focusNode.rightChild; 

       if(focusNode == null){ 
        parent.rightChild = newNode; 
        return; 
       } 
      } 

     } 
    } 
} 
public void traverse(Node focusNode){ 
if(focusNode != null){ 

    traverse(focusNode.leftChild); 

    traverse(focusNode.rightChild); 
} 
} 


class Node{ 

double key; 
String name; 

Node leftChild; 
Node rightChild; 

Node(double key, String name){ 
    this.key = key; 
    this.name = name; 
} 

} 

public void keyChange(Node focusNode, double newkey){ 
focusNode.key = newkey; 
} 

public Node findNode(double key) { 



Node focusNode = root; 

    while (focusNode.key != key) { 


     if (key < focusNode.key) { 

      focusNode = focusNode.leftChild; 

      } else { 

       focusNode = focusNode.rightChild; 
      } 

      if (focusNode == null) 
       return null; 

} 

    return focusNode; 

} 


public static void main(String[] args){ 
LearningTree Tree = new LearningTree(); 
Scanner sc = new Scanner(System.in); 

//Nodes 
Tree.addNode(1500, "Does it have wings?"); 
Tree.addNode(750, "Is it a dog?"); 



System.out.println("Is it an animal?"); 

double n = 1000; 

while(true){ 
String Answer = sc.nextLine(); 
String answer = Answer.toLowerCase(); 

double k = n; 


if(answer.equals("y")){ 
    n = 1.5* n; 
} 
if(answer.equals("n")){ 
    n = .5*n; 
} 
if(Tree.findNode(n) != null){ 

System.out.println(Tree.findNode(n).name + " (y/n)"); 
} 

if(Tree.findNode(n) == null){ 
    System.out.println("What is it?"); 
    String answer1 = sc.nextLine(); 
    System.out.println("What would distinguish a " + answer1 + "from the  previous guess?"); 
    String answer2 = sc.nextLine(); 
    System.out.println("What would the answer be to " + answer2 + "? (y/n)"); 
    String answer3 = sc.nextLine(); 
    double s; 

    if(Tree.findNode(k/1.5) == null){ 
     Tree.findNode(k/.5); 
    } else { 
     Tree.findNode(k/1.5); 
    } 

    if(answer3.equals("y")){ 
     Tree.keyChange(Tree.findNode(k), n); 
     s = 1.5; 
     Tree.addNode(n, Tree.findNode(n).name); 
    } 

    if(answer3.equals("n")){ 
      Tree.keyChange(Tree.findNode(k), n); 
      s = .5; 
      Tree.addNode(n, Tree.findNode(n).name); 
    } 
    Tree.addNode(k, answer2); 






      } 


    } 





} 



} 

ответ

0

Возможно, вы могли бы использовать локальный файл и сериализовать данные. Java обрабатывает это довольно хорошо.

ПРИМЕЧАНИЕ. Я не тестировал этот код, но это начальное место.

private void saveNode(Node n){ 
    FileOutputStream fout = new FileOutputStream("file.txt"); 
    ObjectOutputStream oos = new ObjectOutputStream(fout); 
    oos.writeObject(n); 
    oos.close(); 
} 

private Node readNode(){ 
    FileInputStream fin = new FileInputStream("file.txt"); 
    ObjectInputStream ois = new ObjectInputStream(fin); 
    Node n = (Node)ois.readObject(); 
    ois.close(); 
    return n; 
} 
+0

Нет, по-видимому, его не seriazable или что-то в этом meansException в теме "главный" java.io.NotSerializableException: LearningTree $ Node \t на java.io.ObjectOutputStream.writeObject0 (Unknown Source) \t в java.io .ObjectOutputStream.writeObject (Неизвестный источник) \t at LearningTree.saveNode (LearningTree.java:103) \t at LearningTree.main (LearningTree.java:167) – metelofe

0

Вы можете сериализовать этот объект в файл, так что он может получить данные обратно, когда он работает в следующий раз через десериализацию , Проверьте документацию класса ObjectOutputstream. Сказав, что вам нужно иметь некоторую логику, чтобы пойти с ним,

Смежные вопросы