Search code examples
javalinked-listprintwriter

Why won't this PrintWriter populate this file?


I have a program which takes Giraffes from a text file, creates an ArrayList and LinkedList out of them (redundant, I know... LinkedList was a requirement of the second part of the assignment and I liked my ArrayList), sorts out who their parents are, and then is supposed to print a VBA macro out to a file.

The file (D:\\Java\\Macro.txt) is created, but it isn't populated with anything. Why isn't anything getting printed to the file? I think that there is an issue creating an array to return to the main function though.

I suspect that the problem is within the GetYearGroup method in the Herd Class, and the way that it is interfacing with the PrintWriter located on lines 51-83 of the Main class.

Here is the code:

HW4_Name.java (main)

package giraffe;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;

public class HW4_Name {
    public static void main(String[] args) throws IOException {
        ArrayList<Giraffe> giraffes = new ArrayList<>();
        String temp[] = new String[13];
        String header = "";
        String fileLocation = "theHerd.txt";
        File textFile = new File(fileLocation);
        Scanner in = new Scanner(textFile);
        if (textFile.canRead()) {
            header = in.nextLine();
            while (in.hasNextLine()) {
                temp = in.nextLine().split("\\t", 13);
                giraffes.add(new Giraffe(temp));
                }
            }

        Herd herd = new Herd();
        for(int i = 0; i < giraffes.size(); i++){
            Giraffe g = giraffes.get(i);
            herd.Add(g);
        }
        int nGiraffes = herd.Size();
        for(int i = 0; i < nGiraffes; i++){
            Giraffe g = herd.GetAt(i);

            int nSire = g.getSireId();
            if (nSire != -1){
                g.setSire(herd.Find(nSire));
            }

            int nDam = g.getDamId();
            if (nDam != -1){
                g.setDam(herd.Find(nDam));
            }
        }
        in.close();

        PrintWriter pw = new PrintWriter("C:\\Java\\Macro.txt");
        int nHeight = 500;
        int nWidth = 900;
        int nYearHeight = nHeight / 13;
        int nRectangle = 0;
        for(int i = 0; i < 13; i++){
            int nLowYear = 50 + 5 * i;
            Giraffe[] ThisGroup = herd.GetYearGroup(nLowYear, nLowYear + 5);
            int nThisGroup = ThisGroup.length;
            int nXSpacing = nWidth / (nThisGroup + 1);
            int nYPos = 10 + nYearHeight * i;
            for(int j = 0; j < nThisGroup; j++){
                nRectangle++;
                int nXPos = 10 + nXSpacing/2 + nXSpacing * j;
                Giraffe g = ThisGroup[j];
                g.setRectangle(nRectangle);
                String strName = g.getName();
                pw.println("Call Box(" + nXPos + ", " + nYPos + ", \"" +strName + "\")");
            }
        }
        for(int i = 0; i < nGiraffes; i++){
            Giraffe g = herd.GetAt(i);
            Giraffe gSire = g.getSire();
            if (gSire != null){
                int nParentRectangle = gSire.getRectangle();
                nRectangle = g.getRectangle();
                if (nParentRectangle > 0 && nRectangle > 0){
                    pw.println("Call DadLine(" + nParentRectangle + ", " + nRectangle + ")");
                }
            }
            Giraffe gDam = g.getDam();
            if(gDam != null){
                int nParentRectangle = gDam.getRectangle();
                if (nParentRectangle > 0 && nRectangle > 0){
                    pw.println("Call MomLine(" + nParentRectangle + ", " + nRectangle + ")");
                }
            }
        }
        pw.close();
    }
}

Giraffe.java

package giraffe;
import java.util.ArrayList;

public class Giraffe extends Object {

    private String birthLocation, subSpecies, zoo, city, state, event, name,
    localId, sex, eachGiraffe;
    private int gId, birthYear, sireId, damId, gRectangle;
    private Giraffe gSire, gDam;

    public Giraffe(String array[]){
        this.sex = String.format("%-1s",array[1]);
        this.birthLocation = String.format("%-12s",array[5]);
        this.localId = String.format("%-7s",array[6]);
        this.name = String.format("%-20s",array[7]);
        this.subSpecies = String.format("%-14s",array[8]);
        this.zoo = String.format("%-35s",array[9]);
        this.city = String.format("%-17s",array[10]);
        this.state = String.format("%-13s",array[11]);
        this.event = String.format("%-7s",array[12]);
        this.gId = Integer.parseInt(array[0]);
        this.birthYear = Integer.parseInt(array[2].substring(0,4));

        if(array[3].equals("WILD") || array[3].equals("UNK")){
            this.sireId = -1;
        }
        else{
            this.sireId = Integer.parseInt(array[3]);
        }

        if(array[4].equals("WILD") || array[4].equals("UNK")){
            this.damId = -1;
        }
        else{
            this.damId = Integer.parseInt(array[4]);
        }
    }
    public String getName(){
        return this.name;
    }
    public int getId(){
        return gId;
    }
    public int getBirthYear(){
        return birthYear;
    }
    public int getSireId(){
        return sireId;
    }
    public int getDamId(){
        return damId;
    }
    public Giraffe getSire(){
        return gSire;
    }
    public int getRectangle(){
        return gRectangle;
    }
    public Giraffe getDam(){
        return gDam;
    }
    public void setSire(Giraffe nSire){
        this.gSire = nSire;
    }
    public void setDam(Giraffe nDam){
        this.gDam = nDam;
    }
    public void setRectangle(int nRectangle){
        this.gRectangle = nRectangle;
    }
    public String toString(){
        eachGiraffe = ("" + this.gId);
        return eachGiraffe;
    }
}

Herd.java

package giraffe;

public class Herd extends LinkedList{
    public Herd(){
    }
    public void Add(Giraffe g){
        InsertRight(g);
    }
    public Giraffe Find(int idNumber){
        Giraffe g = null;
        Node currNode = start;
        while(currNode != null && currNode.o.getId() != idNumber){
            currNode = currNode.next;
        }
        if(currNode.o.getId() == idNumber){
            g = currNode.o;
        }
        return g;
    }
    public Giraffe GetAt(int nIndex){
        Giraffe g = null;
        Node currNode = start;
        for(int i = 0; i < nIndex; i++){
            if(currNode != null){
                currNode = currNode.next;
            }
        }
        g = currNode.o;
        return g;
    }
    public Giraffe[] GetYearGroup(int nBegin, int nEnd){
        int nGiraffes = Size();
        int nInGroup = 0;
        for(int i = 0; i < nGiraffes; i++){
            Giraffe g = GetAt(i);
            int nBirthYear = g.getBirthYear();
            if (nBegin <= nBirthYear && nBirthYear < nEnd){
                nInGroup++;
            }
        }
        Giraffe[] gary = new Giraffe[nInGroup];
        nInGroup = 0;
        for(int i = 0; i < nGiraffes; i ++){
            Giraffe g = GetAt(i);
            int nBirthYear = g.getBirthYear();
            if(nBegin <= nBirthYear && nBirthYear < nEnd){
                gary[nInGroup] = g;
                nInGroup++;
            }
        }
        return gary;
    }
}

LinkedList.java

package giraffe;

public class LinkedList {
    protected Node start;
    private int errorReturn;
    public LinkedList(){
        start = null;
    }
    public LinkedList(int errorValue){
        start = null;
        errorReturn = errorValue;
        System.out.println(errorReturn);
    }
    public boolean isEmpty(){
        return (start == null);
    }
    public void InsertRight(Giraffe data){
        Node currNode;
        if (start == null){
            start = new Node(data,start);
        }
        else{
            currNode = start;
            while (currNode.next != null){
                currNode = currNode.next;
            }
            currNode.next = new Node (data, null);
        }
    }
    public int Size(){
        int length = 0;
        Node currNode = start;

        while(currNode != null){
            length++;
            currNode = currNode.next;
        }
        return length;
    }
    public void Display(){
        Node currNode = start;
        System.out.println("List contents: ");

        while (currNode != null){
            currNode = currNode.next;
        }
        System.out.println("--------------------------");
    }
}

Node.java

package giraffe;

public class Node {
    Giraffe o;
    Node next;

    public Node(Giraffe giraffe, Node nextNode){
        o = giraffe;
        next = nextNode;
    }
}

Solution

Thank you to durron597 for pointing out that the birthYear function was not comparable to the GetYearGroup function.

Replacing:

for(int i = 0; i < 13; i++){
        int nLowYear = 50 + 5 * i;

With:

for(int i = 0; i < 13; i++){
    int nLowYear = 1950 + 5 * i;

Resolved the issue.


Solution

  • I see two problems, both of which could result in the things you're seeing:

    1. You are outputting to the C:\\Java\\Macro.txt directory, but you are using a relative path to find your theHerd.txt. Try changing your theHerd.txt file to an absolute path, or use Class.getResourceAsStream() if the file is on your classpath.
      • Use a debugger to see if the Giraffe objects are getting created at all
    2. Your birth year check seems really weird:

      for(int i = 0; i < 13; i++){
          int nLowYear = 50 + 5 * i;
          Giraffe[] ThisGroup = herd.GetYearGroup(nLowYear, nLowYear + 5);
      
      • This is only going to check years in the range 50, 55, up to 115. However, in your Giraffe class, you do this:

        this.birthYear = Integer.parseInt(array[2].substring(0,4));
        

        This is only going to work (i.e. not throw an ArrayIndexOutOfBounds exception) for 4 digit date years, none of which are in the range 50-115. However, if you set your year to a value like 0073 (you must put the leading zeroes) then your program will print results like Call Box(235, 162, "GiraffeName "). You probably want to change that 50 to 1950.


    Your program has other code smells; I suggest reading things like (in order of increasing time commitment):

    But these two bits of code should get you started.