尝试用数组构造线性的优先队列
public Array(int capacity) {
data = (E[]) new Object[capacity];
size = 0;
}
这里必须将Array和ArrayPriorityQueue都统一为泛型E的类型,否则报错:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;
at ArrayPriorityQueue$Array.<init>(ArrayPriorityQueue.java:10)
at ArrayPriorityQueue.<init>(ArrayPriorityQueue.java:72)
at ArrayPriorityQueue.<init>(ArrayPriorityQueue.java:77)
at ArrayPriorityQueue.main(ArrayPriorityQueue.java:136)
但是统一泛型后,arr的get(index)方法在进行比较时提示必须进行强制类型转换,这里编译器将返回值识别为了Object类型:
然而我get函数返回值明明是E类型:
public E get(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("Get failed. Index is illegal.");
}
return data[index];
}
虽然结果能出来,但是有点想不通,请老师指教
还有就是泛型表示为ArrayPriorityQueue<E extends Comparable<? super E>>
是否会更好?百度了一下,Comparable<? super E>
和Comparable<? extends E>
两者的区别好像说的不是很清楚,我看java API大量使用这种表达方式,老师能否指导一下?谢谢啦
PS:数组构造优先队列,出队操作设置为O(1),那么入队的时候就要像我这样进行数据比较;入队操作为O(1)那么意味着队列的顺序就是乱的,那么出队操作就需要进行扫描,时间复杂度为O(n)。相较来说,入队操作进行比较,最终显示结果比较直观一点。