Question
Note that the class FitnessTracker is at the top of the inheritance hierarchy and that each of the classes inheriting from it, present different features.
Note that the class FitnessTracker is at the top of the inheritance hierarchy and that each of the classes inheriting from it, present different features.
To simplify the problem, our classes are only storing one type of measurement, either the total number of steps class StepsFitnessTracker, or the total distance walked class DistanceFitnessTracker, or the average heart rate class HeartRateFitnessTracker. As opposed to what happens with commercial fitness trackers, none of our trackers is able to track simultaneously distance, heart rate and steps. Each of these classes also have a method with a signature similar to: public void addXYZ(XYZ newMeasurement) For example: - StepsFitnessTracker has addSteps(Steps steps) - HeartRateFitnessTracker has addHeartRage(HeartRate newHeartRate) These methods are meant to add more measurements to these objects, and they are meant to either keep the total distance, number of steps walked, or average heart rate. See the code provided and the comments in the code to understand how they work.
Task
Create an object of type FitnessExperiment that stores an array of StepsFitnessTracker, DistanceFitnessTracker, and HeartRateFitnessTracker objects. You could use code such as the following to initialise the array containing the fitness tracker measurements: FitnessTracker[] trackers = { new StepsFitnessTracker("steps", new Steps(230)), new StepsFitnessTracker("steps2", new Steps(150)), new StepsFitnessTracker("steps2", new Steps(150)), new HeartRateFitnessTracker("hr", new HeartRate(80)), new HeartRateFitnessTracker("hr", new HeartRate(80)) }; In the FitnessExperiment class, complete the implementation of the methods named getTotalSteps()and printExperimentDetails(). The comments in the code specify how they should operate and provide you with additional hints to get you started. You can use the method getSteps()in StepsFitnessTracker, but think how you will know the real type of each object in the array of fitness trackers
StepFitnessTracker.java:
public class StepsFitnessTracker extends FitnessTracker {
// Stores total number of steps private Steps totalSteps; public StepsFitnessTracker(String modelName, Steps steps) { super(modelName); this.totalSteps = steps; } // Add steps to the total public void addSteps(Steps stepsToAdd) { int numSteps = this.totalSteps.getValue() + stepsToAdd.getValue(); this.totalSteps.setValue(numSteps); } // Getter for total number of steps public Steps getTotalSteps() { return totalSteps; } public String toString() { return "Steps Tracker " + getModelName() + "; Total Steps: " + getTotalSteps().getValue(); } /* @Override public boolean equals(Object obj) { // TODO Implement a method to check equality } */
}
FitnessTracker.java:
public class FitnessExperiment { FitnessTracker[] fitnessTrackers; public static void main(String[] args) { } // Constructor public FitnessExperiment(FitnessTracker[] fitnessTrackers) { this.fitnessTrackers = fitnessTrackers; } // Methods to implement:
/* // Implementation hint: Should it use the corresponding toString() methods for // each of the objects stored in the fitnessTrackers array? public String toString() { // TODO Implement } // Method displays in console the details of this experiment which include: // - Summary of the measurements of each individual fitness tracker // (indicating if they are steps, distance or heart rate measurements) // - The total number of fitness trackers that participated in this experiment // - A summary of total number of steps and total distance walked in this experiment // Implementation hint: Should it use the toString() method right above this method? public void printExperimentDetails() { // TODO Implement } // Method should iterate through all fitness tracker step measurements and returns a double // with the total step count (see Task 2) // Implementation hint: The instanceof operator and casting may become handy here public int getTotalSteps() { // TODO Implement } // Method should iterate through all fitness tracker distance measurements and returns a double with the total distance // Implementation hint: The instanceof operator and casting may become handy here public double getTotalDistance() { // TODO Implement } public FitnessTracker[] getTrackersEqualTo(FitnessTracker tracker) { // TODO Implement a method that finds the trackers which are equal to tracker } // Implementation hint: use the above getTrackersEqualTo() method public void printAllEqualTrackers() { // TODO Implement a method which prints every duplicate tracker } */ } HeartRateFitnessTracker.java:
public class HeartRateFitnessTracker extends FitnessTracker {
// Cumulative moving average HeartRate HeartRate avgHeartRate; // Number of heart rate measurements int numMeasurements; public HeartRateFitnessTracker(String modelName, HeartRate heartRate) { super(modelName); // Only one HeartRate to begin with; average is equal to single measurement this.avgHeartRate = heartRate; this.numMeasurements = 1; } public void addHeartRate(HeartRate heartRateToAdd) { // Calculate cumulative moving average of heart rate // See https://en.wikipedia.org/wiki/Moving_average double newHR = heartRateToAdd.getValue(); double cmaHR = this.avgHeartRate.getValue(); double cmaNext = (newHR + (cmaHR * numMeasurements)) / (numMeasurements + 1); this.avgHeartRate.setValue(cmaNext); numMeasurements ++; } // Getter for average heart rate public HeartRate getAvgHeartRate() { return avgHeartRate; }
public String toString() { return "Heart Rate Tracker " + getModelName() + "; Average Heart Rate: " + getAvgHeartRate().getValue() + ", for " + numMeasurements + " measurements"; }
/* @Override public boolean equals(Object obj) { // TODO Implement a method to check equality } */
}
Steps.java:
public class HeartRate { // Instance variables private double value; // Constructor public HeartRate(double value) { this.value = value; } // Methods; you should remove the block comments and complete the method bodies public double getValue() { return value; } public void setValue(double newValue) { value=newValue; }
public String toString() { String outString = "Heart Rate="+value; return outString; } }
HeartRate.java:
public class Steps { // Instance variables private int value; // Constructor public Steps(int value) { this.value = value; } // Methods; you should remove the comments and complete the method bodies public int getValue() { return value; } public void setValue(int newValue) { value=newValue; }
public String toString() { String outString = "Steps ="+value; return outString; } }
Any thing with TODO Implement needs to be solved, none of the java classes are not allowed to be changed except the TODO implement
Step by Step Solution
There are 3 Steps involved in it
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started