Search code examples
javafileinputstreamjcreator

Printing two Strings simultaneously in loop but on separate "paragraphs"


First class:

public class Pets
{
    // Instance variables
    private String name;
    private int age;             //in years
    private double weight;       //in pounds

    // Default values for instance variables
    private static final String DEFAULT_NAME = "No name yet." ;
    private static final int DEFAULT_AGE = -1 ;
    private static final double DEFAULT_WEIGHT = -1.0 ;

   /***************************************************
    * Constructors to create objects of type Pet
    ***************************************************/

    // no-argument constructor
    public Pets()
    {
        this(DEFAULT_NAME, DEFAULT_AGE, DEFAULT_WEIGHT) ;
    }
    // only name provided
    public Pets(String initialName)
    {
        this(initialName, DEFAULT_AGE, DEFAULT_WEIGHT) ;
    }
    // only age provided
    public Pets(int initialAge)
    {
        this(DEFAULT_NAME, initialAge, DEFAULT_WEIGHT) ;
    }
    // only weight provided
    public Pets(double initialWeight)
    {
        this(DEFAULT_NAME, DEFAULT_AGE, initialWeight) ;
    }
    // full constructor (all three instance variables provided)
    public Pets(String initialName, int initialAge, double initialWeight)
    {
        setName(initialName) ;
        setAge(initialAge) ;
        setWeight(initialWeight) ;
    }

   /****************************************************************
    * Mutators and setters to update the Pet.  Setters for age and
    * weight validate reasonable weights are specified
    ****************************************************************/

    // Mutator that sets all instance variables
    public void set(String newName, int newAge, double newWeight)
    {
        setName(newName) ;
        setAge(newAge) ;
        setWeight(newWeight) ;
    }

    // Setters for each instance variable (validate age and weight)
    public void setName(String newName)
    {
        name = newName;
    }
    public void setAge(int newAge)
    {
        if ((newAge < 0) && (newAge != DEFAULT_AGE))
        {
            System.out.println("Error: Invalid age.");
            System.exit(99);
        }
        age = newAge;
    }
    public void setWeight(double newWeight)
    {
        if ((newWeight < 0.0) && (newWeight != DEFAULT_WEIGHT))
        {
            System.out.println("Error: Invalid weight.");
            System.exit(98);
        }
        weight = newWeight;
    }

   /************************************
    * getters for name, age, and weight
    ************************************/
    public String getName( )
    {
        return name ;
    }
    public int getAge( )
    {
        return age ;
    }
    public double getWeight( )
    {
        return weight ;
    }

   /****************************************************
    * toString() shows  the pet's name, age, and weight
    * equals() compares all three instance variables
    ****************************************************/
    public String toString( )
    {
        return ("Name: " + name + "  Age: " + age + " years"
                       + "   Weight: " + weight + " pounds");
    }
    public boolean equals(Pets anotherPet)
    {
        if (anotherPet == null)
        {
            return false ;
        }
        return ((this.getName().equals(anotherPet.getName())) &&
                (this.getAge() == anotherPet.getAge()) &&
                (this.getWeight() == anotherPet.getWeight())) ;
    }
}

Main class:

import java.util.Scanner ;
import java.io.FileInputStream ;
import java.io.FileNotFoundException ;
import java.io.IOException ;

public class PetsMain 
{
    public static void main (String[] args)
    {
        Scanner keyboard = new Scanner(System.in) ;
        System.out.println("Please enter the number of pets") ;
        int numberOfPets = keyboard.nextInt() ;

        String fileName = "pets.txt" ; 
        FileInputStream fileStream = null ;

        String workingDirectory = System.getProperty("user.dir") ;
        System.out.println("Working Directory for this program: " + workingDirectory) ;

        try
        {
            String absolutePath = workingDirectory + "\\" + fileName ;
            System.out.println("Trying to open: " + absolutePath) ;
            fileStream = new FileInputStream(absolutePath) ;
            System.out.println("Opened the file ok.\n") ;
        }
        catch (FileNotFoundException e)
        {
            System.out.println("File \'" + fileName + "\' is missing") ;
            System.out.println("Exiting program. ") ;
            System.exit(0) ;
        }

        Scanner fileScanner = new Scanner(fileStream) ;
        int sumAge = 0 ;
        double sumWeight = 0 ;

        String petName = "Pet Name" ;
        String dogAge = "Age" ;
        String dogWeight = "Weight" ;
        String line = "--------------" ;
        System.out.printf("%11s %15s %19s %n", petName, dogAge, dogWeight) ;
        System.out.printf("%s %17s %17s %n", line, line, line) ;
        for (int counter = 0; counter < numberOfPets; counter++) 
        {
            fileScanner.useDelimiter(",") ;                
            String name = fileScanner.next() ;
            fileScanner.useDelimiter(",") ;
            int age = fileScanner.nextInt() ;
            fileScanner.useDelimiter("[,\\s]") ;
            double weight = fileScanner.nextDouble() ;
            Pets pets = new Pets(name, age, weight) ; 
            sumAge += age ; 
            sumWeight += weight ;
            System.out.printf("%-15s %15d %18s %n", name, age, weight) ; 

            System.out.println(pets.toString()) ; // Print until above is done

        }

        /*How do I make this? 
         Smallest pet: Name: Tweety  Age: 2 years  Weight: 0.1 pounds
         Largest pet:  Name: Dumbo  Age: 6 years  Weight: 2000.0 pounds
         Youngest pet: Name: Fido  Age: 1 years  Weight: 15.0 pounds
         Oldest pet:   Name: Sylvester  Age: 10 years  Weight: 8.3 pounds
        */

        System.out.println("\nThe total weight is " + sumWeight) ;
        System.out.println("\nThe total age is " + sumAge) ;

        try
        {
            fileStream.close() ;
        }
        catch (IOException e)
        {
            // don't do anything
        }

    }

}

Keep in mind that only the Main class is the one we can make changes to. In the Main class, the part where I noted

// Print until above is done it prints the following:

       Pet Name             Age              Weight
--------------    --------------    --------------
Fido                          1               15.0
Name: Fido  Age: 1 years   Weight: 15.0 pounds

Tweety                      2                0.1
Name:
Tweety  Age: 2 years   Weight: 0.1 pounds

Sylvester                  10                8.3
Name:
Sylvester  Age: 10 years   Weight: 8.3 pounds

Fido                        1               15.0
Name:
Fido  Age: 1 years   Weight: 15.0 pounds

Dumbo                       6             2000.0
Name:
Dumbo  Age: 6 years   Weight: 2000.0 pounds

Is it possible to make it print on a different "paragraph"? For example, like this:

Pet Name             Age              Weight
--------------    --------------    -------------- 
Fido                          1               15.0

Tweety                      2                0.1

Sylvester                  10                8.3

Fido                        1               15.0

Dumbo                       6             2000.0

Name: Fido  Age: 1 years   Weight: 15.0 pounds
Name: Tweety  Age: 2 years   Weight: 0.1 pounds
Name: Sylvester  Age: 10 years   Weight: 8.3 pounds
Name: Fido  Age: 1 years   Weight: 15.0 pounds
Name: Dumbo  Age: 6 years   Weight: 2000.0 pounds

I tried to create a different loop for the second part but I ran into the problem of trying to access the pets. The only one that would access was the last one used. Any thoughts?

UPDATE: The major issue is solved but I have a minor issue left. When I run the program I get this:

Name: Fido  Age: 1 years   Weight: 15.0 pounds
Name: 
Tweety  Age: 2 years   Weight: 0.1 pounds
Name: 
Sylvester  Age: 10 years   Weight: 8.3 pounds
Name: 
Fido  Age: 1 years   Weight: 15.0 pounds
Name: 
Dumbo  Age: 6 years   Weight: 2000.0 pounds

Why aren't the rest pets aligned with Name?


Solution

  • The easy way to store individually every pet is to create an ArrayList is like a collection where you store every pet and you can always acces to their infor knowing the index on it.

    As in the code, we declare the variables out of the loop so we can access those variables in hole class, then we initialize the object and we create the ArrayList (remember to create an empty constructor in the Pets class.

    When you have the loop to read the file you add every pet to the ArrayList with:

    pets.add(new Pets(name,age,weight));

    So out of the read loop we create an other loop to acces to every index of the ArrayList, if you only want 1 pet you could make a loop to find an exactly name or things like that is more useful than only print and never store the pets. So basically you can acces to the pet with pets.get(x) where x is the index of the pet.

    public class PetsMain {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
    
            // We declare variables here
            String name;
            int age;
            double weight;
            Pets pet = new Pets(); // Initialize Object
            ArrayList<Pets> pets = new ArrayList<Pets>(); // We create the ArrayList
    
    
            Scanner keyboard = new Scanner(System.in) ;
            System.out.println("Please enter the number of pets") ;
            int numberOfPets = keyboard.nextInt() ;
    
            String fileName = "pets.txt" ; 
            FileInputStream fileStream = null ;
    
            String workingDirectory = System.getProperty("user.dir") ;
            System.out.println("Working Directory for this program: " + workingDirectory) ;
    
            try
            {
                String absolutePath = workingDirectory + "\\" + fileName ;
                System.out.println("Trying to open: " + absolutePath) ;
                fileStream = new FileInputStream(absolutePath) ;
                System.out.println("Opened the file ok.\n") ;
            }
            catch (FileNotFoundException e)
            {
                System.out.println("File \'" + fileName + "\' is missing") ;
                System.out.println("Exiting program. ") ;
                System.exit(0) ;
            }
    
            Scanner fileScanner = new Scanner(fileStream) ;
            int sumAge = 0 ;
            double sumWeight = 0 ;
    
            String petName = "Pet Name" ;
            String dogAge = "Age" ;
            String dogWeight = "Weight" ;
            String line = "--------------" ;
            System.out.printf("%11s %15s %19s %n", petName, dogAge, dogWeight) ;
            System.out.printf("%s %17s %17s %n", line, line, line) ;
            for (int counter = 0; counter < numberOfPets; counter++) 
            {
                fileScanner.useDelimiter(",") ;                
                name = fileScanner.next() ;
                fileScanner.useDelimiter(",") ;
                age = fileScanner.nextInt() ;
                fileScanner.useDelimiter("[,\\s]") ;
                weight = fileScanner.nextDouble() ;
                sumAge += age ; 
                sumWeight += weight ;
                System.out.printf("%-15s %15d %18s %n", name, age, weight) ; 
    
                // **We add the pet to the collection
                pets.add(new Pets(name,age,weight)); // Adding it to the ArrayList
            }
    
            // Then we acces to the ArrayList and we print what we want.
            for(int x=0; x < pets.size(); x++){
                System.out.print(pets.get(x).toString());
            }
    
            System.out.println("\nThe total weight is " + sumWeight) ;
            System.out.println("\nThe total age is " + sumAge) ;
    
            try
            {
                fileStream.close() ;
            }
            catch (IOException e)
            {
                // don't do anything
            }
        }
    
    }
    

    Hope it helped you and if you have any questions add a comment :)

    Here you can easy find info about storing objects on Arraylist and print it:

    How to add an object to an ArrayList in Java

    How to get data from a specific ArrayList row using with a loop?