When I try to run(use) the last method, it start running and never stops. Also When I try to print out aJob the element does not print out correctly. It comes out with odd letters. I am posting the whole class because I am guessing that I am making a mistake somewhere else apart from runJod and runAll methods. could anyone tell me what I need to do to fix this please?
import java.util.ArrayList;
/**
*/
public class JobQueue
{
private ArrayListmyJobInQueue; //a list of job to be done
private ArrayList<Job>myFinishedJobs;// a list of compleated job
private int myJobDuration; //duration if one job
private int myTimeLeft;//total time left
/**
* Constructor for objects of class JobQueue
*/
public JobQueue()
{
myJobInQueue = new ArrayList<Job>();
myFinishedJobs = new ArrayList<Job>();
myJobDuration =0;
myTimeLeft=0;
}
/**
* Return the list of jobs that have not been completed (including the current job).
*/
public ArrayList<Job> getPendingJobs()
{
return myJobInQueue;
}
/**
* Return the list of jobs that have been completed.
*/
public ArrayList<Job> getCometedJobs()
{
return myFinishedJobs;
}
/**
* Return the job at the front of the pending queue, or null if the queue is empty.
*/
public Job getCurrentJob()
{
if(myJobInQueue!=null)
{
Job FirstJobInTheQueue = myJobInQueue.get(0);
return FirstJobInTheQueue;
}
else
{
return null;
}
}
/**
* Return the amount of time left on the clock (as an integer)
*/
public int getTimeLeft()//Ok
{
return myTimeLeft;
}
/**
* Return the total duration of all the pending jobs(as an integer).
*/
public int getTotalDuration()
{
int myTimeLeft= 0;
for(int i = 0; i<myJobInQueue.size();i++)
{
int num = myJobInQueue.getDuration(i); //I think this line is wrong.
myTimeLeft = myTimeLeft + num ;
}
return myTimeLeft;
}
/**
* Add a Job to the end of the Queue
*/
public void addJob(Job job)
{
if(job!=null)
{
myJobInQueue.add(job);
}
}
/**
* Add the specified number of seconds to the clock.
*/
public void addTime(int seconds)
{
if(seconds>0)
{
myTimeLeft = myTimeLeft + seconds;
}
}
/**
* Run the first job on the queue if there is enough time on the clock and the job queue list is not empty.
* And move the job to the finished jobs list.
*/
public void runAJob(){
if(!myJobInQueue.isEmpty())
{
myJobDuration = myJobInQueue.get(0).getDuration();
if (myJobDuration < myTimeLeft)
{
myTimeLeft = myTimeLeft - myJobDuration;
myFinishedJobs.add(myJobInQueue.get(0));
System.out.println("A job is running: " + myJobInQueue.get(0).getName());
myJobInQueue.remove(0);
}
else
{
System.out.println("Not enogth running time left, please add time on the clock.");
}
}
else
{
System.out.println("No pending job on the list.");
}
}
/**
* Run all the jobs on the queue in order until it runs out of time.
*/
public void runAll()
{
for(int i = 0; myTimeLeft > 0 && myTimeLeft > myJobDuration;i++);
{
runJob();
}
System.out.println("Job can not be run, not enough time left." );
}
}
Based on your comment, the line
System.out.println("Ajob is running"+ myJobInQueue.get(0));is printing out the object reference for theJobreturned bymyJobInQueue.get(0). In order for that line to print out meaningful information, just make sureJobhas atoStringmethod that returns aStringthat describes the object.I think your second problem is caused by the
myTimeLeftvariable dropping belowmyJobDuration, but not below 0. I don’t see where you decrementmyTimeLeftwhen it’s in this window.Side Note: Do all jobs have the same duration? If not, then you should probably be using the duration for the next
Jobinstead of a globalmyJobDurationvariable.