优先级队列上的classCastException; Java的

时间:2015-04-07 06:33:04

标签: java

我正在实现一个包含5个进程的优先级队列。每个进程都有相同的字段和不同的值。我有3节课。一个是该过程的模板,另一个是我将针对这些过程实现的实际算法和一个测试。我正在尝试打印出优先级队列中进程的所有arrival_time属性。这些字段都是整数,但实际的进程是Process类型,它会使PriorityQueue类崩溃。我在这里需要帮助。

头等舱:

package SPN;

public class Process {

    public int arrive_time= 0;
    private int burst_time = 0;
    private int remain_time = 0;

    public Process (int arr_time, int bur_time) {

        this.arrive_time = arr_time;
        this.burst_time = bur_time;
    }

    //public int getArrTime() {return arrive_time;}
    public int getBurTime() {return burst_time;}
    public int getRemTime() {return remain_time;}
}

第二课:

package SPN;

import java.util.*;

public class SPN {

    private Process p1, p2, p3, p4, p5;

    //Priority Queue of the processes
    PriorityQueue<Process> prq = new PriorityQueue<Process>();

    public SPN() {

        p1 = new Process(0, 10);
        prq.add(p1);

        p2 = new Process(1, 8);
        prq.add(p2);

        p3 = new Process(2, 11);
        prq.add(p3);

        p4 = new Process(5, 6);
        prq.add(p4);

        p5 = new Process(7, 7);
        prq.add(p5);
    }

    public void test() {

        // create iterator from the queue
        Iterator<Process> it = prq.iterator();

        System.out.println("Values of queue: " + it.next());
    }
}

第三课:

package SPN;

public class Test {

    public static void main(String[] args) {

        SPN spn = new SPN();
        spn.test();
    }
}

2 个答案:

答案 0 :(得分:1)

为了使PriorityQueue能够对对象(Process对象)进行优先级排序,它必须是一个Comparable对象。

public class Process implements Comparable<Process> {

    //your existing code here

    @Override
    public int compareTo(Process proc) {
        //implement this
        return 0;
    }
}

答案 1 :(得分:1)

PriorityQueue需要知道如何订购对象。有两种方法可以定义它:
1.正如@OriLentz所说,你可以使你的Process具有可比性 2.您可以将显式Comparator传递给PriorityQueue的构造函数:

PriorityQueue<Process> prq = new PriorityQueue<Process>(10, new Comparator<Process>() {
      @Override
      public int compare(Process p1, Process p2) {
          return Integer.compare(p1.arrive_time, p2.arrive_time);
      }
});