2013-02-16 3 views
1

Я пытаюсь сделать цикл while, который будет проходить через очередь приоритетов java и читать в верхней части даты очереди. Один из них имеет значение даты, просматривает оставшуюся часть очереди, чтобы увидеть, используется ли эта дата в другом месте, если это так временно добавить эти элементы в свою очередь, поэтому я могу вызвать другой метод компаратора для их сортировки.Итерация Java через очередь приоритетов

public JobRequest closestDeadlineJob(int freeCPUS) { 
    // find top job to determine if other jobs for date need to be considered 
    JobRequest nextJob = scheduledJobs.peek(); // return top most job 
    // what is it's date? 
    Date currentDate = nextJob.getConvertedDeadlineDate(); 
    JobPriorityQueue schedulerPriorityQueue = new JobPriorityQueue(); 
    schedulerPriorityQueue.addJob(nextJob); 

    while(true) { 


    } 

    // this is the item at the top of the PRIORTY JOB queue to return 
    // remove that item from scheduledJobs 
    // return null; // replace with to the one you want to return 
} 

то, что я до сих пор, как вы можете видеть не очень

+1

Я не понимаю, где трудность. scheduledJobs.iterator()? – Aubin

+0

Или, неявно используя iterator(), 'for (JobRequest job: scheduleJobs)' –

+0

Я знаю эту часть, но я не знаю, как сказать, поиск, чтобы увидеть, является ли GetConvertedDeadlineDate тем же самым, что и любые другие в очереди, а затем поэтому добавьте их в временную очередь, где я могу сортировать что-то еще –

ответ

1
import java.util.Date; 
import java.util.Comparator; 
import java.util.PriorityQueue; 

class Job implements Runnable{ 

Priority priority; 
Date dateOccurance; 

public Job(Priority priority, Date occurance){ 
    this.priority = priority; 
    this.dateOccurance = occurance; 
} 

public void run(){ 
    //Job execution 
    System.out.println("executed"); 
} 
} 

enum Priority { 
High, 
Medium, 
Low 
} 

class JobComparator implements Comparator<Job> { 

@Override 
public int compare(Job j1, Job j2) { 

    if(j1.priority.ordinal() > j2.priority.ordinal()) { 
     return 1; 
    } else if (j1.priority == j2.priority) { 
     if(j1.dateOccurance.after(j2.dateOccurance)) { 
      return 1; 
     } else if (j1.dateOccurance.before(j2.dateOccurance)) { 
      return -1; 
     } else { 
      return 0; 
     } 
    } 
    return -1; 
} 

} 

public class PriorityQueueTest { 

public static void main(String[] args) throws InterruptedException { 
    Date d = new Date(); 
    Job job1 = new Job(Priority.High, d); 
    Job job2 = new Job(Priority.High, d); 
    Job job3 = new Job(Priority.Medium, d); 
    Job job4 = new Job(Priority.Low, d);  
    Thread.sleep(2000); 
    Date l = new Date(); 
    Job job5 = new Job(Priority.Low, l);  

    Comparator<Job> jComp = new JobComparator(); 
    PriorityQueue<Job> queue = 
     new PriorityQueue<Job>(10, jComp); 

    queue.add(job4); 
    queue.add(job3); 
    queue.add(job1); 
    queue.add(job2); 
    queue.add(job5); 


    while (queue.size() != 0) 
    { 
     Job j = queue.remove(); 
     System.out.println(j.priority +"  "+j.dateOccurance); 
    } 
}  

} 
+0

Я бы рекомендовал предупредить читателя, что использование регулярного цикла/итерации и печати также испортит порядок очереди приоритетов. – Campa

3

PriorityQueue не дает вам отсортированный порядок итерации. Единственной гарантией PriorityQueue является то, что методы извлечения (peek/poll/remove) вернут наименьший элемент в наборе в соответствии с вашим компаратором. Если вам нужен отсортированный порядок итерации - вместо этого используйте TreeSet/TreeMap.

+0

Это чрезвычайно важно: looping ('for (el: pQueue)') или печать ('pQueue.toString()'), 'PriorityQueue' превратит очередь в общий контейнер без порядка. – Campa

Смежные вопросы