‘}’;
}
}
public class TestDemo {
public static void main(String[] args) {
Card card1 = new Card(1, “♦”);
Card card2 = new Card(1, “♦”);
Card card3 = new Card(3, “♦”);
//创建一个优先级队列
Queue qu = new PriorityQueue<>();
//先向这个优先级队列中插入一个元素
qu.offer(card1);
qu.offer(card2);
System.out.println(qu);
}
}
此时我们会发现出现了类型转换异常
(ClassCastException):这是为什么呢?
此时我们点开我们报错的代码:
然后找到了对应的报错语句:
此处我们发现其强行将x转换成了Comparable类型,换到我们上面的代码中去相当于x就是我们的Card,而Card这个类型要是想实现类型转换至少应该继承我们的Comparable接口,并且还有一个问题,之前我们在讲优先级队列的时候提到过,我们每个元素再插入的时候都会调整成小根堆,调整成为小根堆的过程其实就是比较大小的过程,之前我们所有的代码插入的是对象是整数,整数非常容易比较大小,但是这次我们插入的是自定义对象,就拿我们card举例,当我们插入第二个自定义对象的时候,我们是比较花色还是比较牌的数字的大小,这个并没有告诉我们怎么比,所以最终当我们的优先级队列查看到第二个插入的元素的时候,需要构建小根堆,但是并没有告诉我们比较插入进来的对象的方式,最终导致了类型转换一吃昂,所以此时我们应该让Card类去实现我们的Comparable接口,并告诉我们比较的方式是什么.
并且大家要注意了:为什么我们之前插入一个整数的时候人家就自动每插入一个元素就可以自动比较大小并且建大/小堆呢?我们来看:
我们摁住Ctrl进入到Integer的源码中:
此时我们会发现人家Integer早已经实现了Comparable接口
此处我们提供两种方法来告诉我们比较的方式是什么:
1:Comparable接口
2:Comparator接口
Comparable接口
按照rank的值进行比较
底层为小根堆
下面我们来给出在优先级队列中插入一个自定义对象时为了防止类型转换异常的正确比较方式:
先来看我们的代码:
class Card implements Comparable {
public int rank; // 数值
public String suit; // 花色
public Card(int rank, String suit) {
this.rank = rank;
this.suit = suit;
}
@Override
public String toString() {
return “Card{” +
“rank=” + rank +
“, suit='” + suit + ‘’’ +
‘}’;
}
@Override
public int compare