简体   繁体   English

为什么我的BST不能写入文件?

[英]Why won't my BST get written to a file?

I'm trying to write my BST into a text file but some how it's not working. 我正在尝试将我的BST写入文本文件,但有些文件不能正常工作。 I would like to know where I messed up at because as of now, nothing is being written into the file. 我想知道我搞砸了哪里,因为截至目前,文件中没有任何内容。 The problem is in the BinaryTree.java . 问题出在BinaryTree.java The display() method is where I'm trying to place the items into Student.txt file. 我正在尝试将项目放入Student.txt文件中的display()方法。

Here's my Node.java : 这是我的Node.java

class Node  {
    Student data;
    Faculty data2;
    Node left;
    Node right;

    public Node(Student data) {
        this.data = data;
        this.left = left;
        this.right = left;
    }

    public Node(Faculty data2) {
        this.data2 = data2;
        this.left = left;
        this.right = right;
    }
}

Here's my BinaryTree.java : 这是我的BinaryTree.java

int index = 0;
String[] sa = new String[index];

public void studentArray() {
    studentArray(root,index);
}

public int studentArray(Node root, int index) {     
    if(root.left != null) {
        index = studentArray(root.left, index);
    } 
    sa[++index] = root.data.getLastName().toString();
    if(root.right != null) {
        index = studentArray(root.right,index);
    }
    return index;
}

public void displayStudent(Node root) throws IOException { 
    if(root != null) { // If root isn't empty.
        if(root.left != null) { 
            displayStudent(root.left); // Recursively display left nodes. 
        }
        System.out.println(root.data.toString()); // Print to the console data that's in the root in order.
        if(root.right != null) {
            displayStudent(root.right); // Recursively display right nodes. 
        }
    }

    String file = "Student.txt"; 
    FileWriter fw = new FileWriter(new File(file));

    try {
        for(index = 0; index < sa.length; index++) {
            fw.write(sa[index] + " ");
        }
        fw.close();
    } catch(Exception e) {
        System.out.println("File not found.");
    }
}

Here's my Main.java : 这是我的Main.java

import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        Student student1 = new Student("Mike", "Piazza", "S3123456");
        Student student2 = new Student("Jack", "Jill", "S3123456");
        Student student3 = new Student("Alice", "Jones", "S3123456");

        BinaryTree bt = new BinaryTree();
        bt.insertStudent(student1);
        bt.insertStudent(student2);
        bt.insertStudent(student3);
        bt.displayStudent(bt.root);
    }   

Here's my Student.txt file: 这是我的Student.txt文件:

*displays nothing*

Java does not have a growing array, so studentArray will not work. Java没有增长的数组,因此studentArray将无法工作。

Either use recursion: 使用递归:

try (PrintWriter out = new PrintWriter(file, "UTF-8")) {
    print(out, root);
} // automatically closes out

void print(PrintWriter out, Node node) {
    if (node != null) {
        print(out, node.left);
        out.println(...);
        print(out, node.right);
    }
}

The try-with-resources is usefull. try-with-resources非常有用。 The charset UTF-8 would allow any sign in the students' names. 字符集UTF-8允许任何标记学生的名字。

Alternative to an array, use ArrayList : 替代数组,使用ArrayList

List<String> sa = new ArrayList<>();

sa.add(root.data.getLastName().toString();

for (int i = 0; i < sa.size(); ++i) { // Old-style, if you need the index i
    String s = sa.get(i);
    ...
    sa.set(i, s + s);
}

for (String s : sa) {
    System.out.println(s);
}

I would suggest to use StringBuilder to create string for display of tree value. 我建议使用StringBuilder来创建用于显示树值的字符串。 Write to file should be in different class so it will be loosely coupled and in feature depending on type of traversal type it will print.If you put in a array then again you need to traverse which will increase complexity and also I will prefer to use iterative way.My logic is using pre-order traversal. 写入文件应该在不同的类中,因此它将松散耦合,并且在功能上取决于它将打印的遍历类型。如果你放入一个数组然后再次需要遍历,这将增加复杂性,我也更愿意使用迭代方式。我的逻辑是使用预订遍历。

public String displayStudent(TreeNode root) {
 if (root == null)
  return null;
 Stack < TreeNode > stack = new Stack < TreeNode > ();
 stack.push(root);
 StringBuilder sb = new StringBuilder();

 while (!stack.isEmpty()) {
  TreeNode h = stack.pop();
  if (h != null) {
   sb.append(h.val + ",");
   if (h.right != null) {
    stack.push(h.right);
   }
   if (h.left != null) {
    stack.push(h.left);
   }

   stack.push(h.left);
  }
 }

 return sb.toString().substring(0, sb.length() - 1);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM