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?
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?