如何打印出元素和列表中的所有元素

时间:2012-10-10 12:27:59

标签: java bluej

当我尝试运行(使用)最后一个方法时,它开始运行并且永不停止。此外,当我尝试打印aJob时,元素无法正确打印。它出现了奇怪的字母。我发布了全班,因为我猜我除了runJod和runAll方法之外还在其他地方犯了一个错误。有谁能告诉我需要做些什么来解决这个问题?

import java.util.ArrayList;

/ **  * /

公共类JobQueue

{     private ArrayListmyJobInQueue; //要完成的工作列表

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." );   
}

}

4 个答案:

答案 0 :(得分:3)

第1点:myJobInQueue.get(0) 没有打印正确的值。

如果您的JobtoString()方法,则会打印正确的值。 另一种方法是调用Job类的getter方法,如

myJobInQueue.get(0).getJobName();

Point2:调试它并看到myTimeLeft的值,它在任何时候都真的低于零。

答案 1 :(得分:2)

根据您的评论,第System.out.println("Ajob is running"+ myJobInQueue.get(0));行打印出Job返回的myJobInQueue.get(0)的对象引用。为了让该行打印出有意义的信息,请确保Job有一个toString方法,该方法返回描述该对象的String

我认为你的第二个问题是由myTimeLeft变量低于myJobDuration但不低于0引起的。我没有看到你在这个窗口中减少myTimeLeft的位置。

备注:所有工作都有相同的持续时间吗?如果没有,那么您应该使用下一个Job的持续时间而不是全局myJobDuration变量。

答案 2 :(得分:1)

问题对我来说不太清楚,但这种情况似乎适合使用 Java并发包,尤其是执行者相关部分Java concurrency: Executor Interfaces

我会使用一个带有单个线程工作程序的执行程序(我想要你的工作逐个完成,否则使用更多的线程),以及一个CountDownLatch,其中包含要完成的工作数。在提交作业Runnables(一旦完成后将锁存器减少)提交给ExecutorService之后,我将发出latch.await(超时)。

编辑第二个想法,你不需要闩锁的魔法,我认为沿着这些方向的东西就足够了:

public void runMyJobs(List<Runnable> myJobs, long timeout, TimeUnit unit) throws InterruptedException {

  ExecutorService e = Executors.newFixedThreadPool(1);
  for(Runnable job: myJobs) {
    e.execute(job);    
  }

  e.awaitTermination(timeout, unit);
  List<Runnable> notCompletedJobs = e.shutdownNow();
}

答案 3 :(得分:1)

在每个人的帮助下回复我,我已经改变了上面的runAJob方法,似乎工作正常。

但也许我不能明确地遵守串通法...... 我正在努力学习从1个类调用方法到另一个类?

我该怎么做......

如果Job类有一个方法来运行单个作业本身,我想将“Job”类中的“run”方法调用为“runAjob”方法。因此,当Job类中的“run”方法被执行时,它会连接到“runAjob”方法,因此它也会被执行。

我的意思是如果myJobInQueue中有2个待处理的作业。

0 - {“洗涤”10分钟}

1 - {“烹饪晚餐”10分钟}

2 - {“洗车”10分钟}

当我使用“run”方法myJobInQueue时,

0 - {“烹饪晚餐”10分钟}

1 - {“洗车”10分钟}

当我使用“runAjob”方法myJobInQueue成为时,

0 - {“洗车”10分钟}

我希望我已经把这个问题弄清楚了。