Класс PrintWriter не работает должным образом - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть программа, которая хранит информацию в двоичном дереве.

Я пытаюсь распечатать всю информацию в текстовом файле, используя PrintWriter, который работал для меня в предыдущих ситуациях, но в этот раз мне не повезло.

Обязательно, чтобы информация вызывалась в узле через объект. Я отладил и определил, что расположение узлов в дереве работает отлично, поэтому проблема заключается в печати в файл.

Последнее, что следует отметить, это то, что если я печатаю на консоль через System.out, она печатается идеально.

import java.io.*;

public class GALABST
{
    public static void main(String[] args) throws IOException
    {
        Tree directory = new Tree();

        InputData newPerson1 = new InputData("luca", "galati", "asdasda", "sadfasdf");
        directory.insert(newPerson1);
        InputData newPerson2 = new InputData("sdfasf", "blackman", "asdasda", "sadfasdf");
        directory.insert(newPerson2);
        InputData newPerson3 = new InputData("fsdgdfg", "kramer", "asdasda", "sadfasdf"); 
        directory.insert(newPerson3);
        InputData newPerson4 = new InputData("dsafgas", "wallace", "asdasda", "sadfasdf");
        directory.insert(newPerson4);
        InputData newPerson5 = new InputData("asdfasdfasdf", "dangelo", "asdasda", 
        "sadfasdf");
        directory.insert(newPerson5);
        InputData newPerson6 = new InputData("sfasdasfas", "alla", "asdasda", "sadfasdf");
        directory.insert(newPerson6);
        InputData newPerson7 = new InputData("hfdhsds", "eeves", "asdasda", "sadfasdf");
        directory.insert(newPerson7);

        File outputFile = new File ("Contacts.txt");
        outputFile.delete();
        directory.print();
    }
}

class InputData
{
    String firstName, lastName, address, phoneNumber;

    InputData (String fN, String lN, String a, String pN)
    {
        firstName = fN;
        lastName = lN;
        address = a;
        phoneNumber = pN;
    }
}

class Tree
{
    private Node root;

    class Node
    {
        InputData inputData;
        Node leftChild, rightChild;

        Node(InputData iD)
        {
            inputData = iD;
            this.leftChild = null;
            this.rightChild = null;
        }
    }

    void insert(InputData inputData)
    {
        root = insert(root, inputData);
    }

    Node insert(Node root, InputData inputData)
    {
        if (root == null)
        {
            root = new Node(inputData);
            return root;
        }
        if (root.inputData.lastName.compareTo(inputData.lastName) < 0)
        {
            root.rightChild = insert(root.rightChild, inputData);
        }
        else if (root.inputData.lastName.compareTo(inputData.lastName) > 0)
        {
            root.leftChild = insert(root.leftChild, inputData);
        }
        else
        {
            if (root.inputData.firstName.compareTo(inputData.firstName) < 0)
            {
                root.rightChild = insert(root.rightChild, inputData);
            }
            else if (root.inputData.firstName.compareTo(inputData.firstName) > 0)
            {
                root.leftChild = insert(root.leftChild, inputData);
            }
            else
            {
                System.out.println("Info already present in contacts");
            }
        }
        return root;
    }

    public void print() throws IOException
    {
        print(root);
    }

    private void print(Node root) throws IOException
    {
        PrintWriter writer = new PrintWriter(new FileWriter("Contacts.txt"), true);

        if(root != null)
        {
            print(root.leftChild);
            writer.write(root.inputData.firstName + "  " + root.inputData.lastName + "  " + 
            root.inputData.address + "  " + root.inputData.phoneNumber);
            print(root.rightChild);
        }
        writer.close();
    }
}

Любой, кто может помочь, был бы очень признателен.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Мне не ясно, что вы пытаетесь сделать. Как указал darioscity, основная проблема заключается в том, что вы каждый раз создаете новый экземпляр PrintWriter; следовательно перезаписываю. Вы можете видеть, что вы на самом деле что-то пишете: первый узел (b c это последний, который вы пишете, следовательно, этот конкретный не перезаписан) вашего дерева находится в файле. До достижения этого вы писали какие-то другие вещи (другие узлы) и переписывали их каждый раз.

public void print() throws IOException {
    PrintWriter writer = new PrintWriter(new FileWriter("Contacts.txt"), true);

    print(root, writer);
}

private void print(Node root, PrintWriter file) throws IOException {

    if (root != null) {
        file.write(root.inputData.firstName + "  " + root.inputData.lastName + "  "
                + root.inputData.address + "  " + root.inputData.phoneNumber + "\n");
        print(root.leftChild, file);

        print(root.rightChild, file);
    }
    file.close();
}

}

Обратите внимание, что с этим кодом (idk, если это то, что вы хотите) вы не пишете каждый узел.

0 голосов
/ 26 апреля 2020

Проблема с вашим методом print заключается в создании нового экземпляра PrintWriter для каждого вызова, записывающего первую строку файла, поэтому при закрытии каждого экземпляра PrintWriter он перезаписывает первую строку файла. , Метод, позволяющий избежать такого поведения, - создать один PrintWriter и передать его в качестве параметра, как показано ниже:

public void print() throws IOException
{
    PrintWriter writer = new PrintWriter(new FileWriter("Contacts.txt"), true);
    print(root, writer);
    writer.close();
}

private void print(Node root, PrintWriter writer) throws IOException
{
    if(root != null)
    {
        print(root.leftChild, writer);
        writer.write(root.inputData.firstName + "  " + root.inputData.lastName + "  " + 
        root.inputData.address + "  " + root.inputData.phoneNumber + "\n"); <-- added \n for clarity
        print(root.rightChild, writer);
    }  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...