0


基于堆实现对象比较

对象比较

元素的比较

在 Java 当中,基本类型的对象可以直接比较大小。代码如下:

publicstaticvoidmain(String[] args){int a =10;int b =20;System.out.println(a > b);System.out.println(a < b);System.out.println(a == b);System.out.println();char c1 ='A';char c2 ='B';System.out.println(c1 > c2);System.out.println(c1 < c2);System.out.println(c1 == c2);System.out.println();boolean b1 =true;boolean b2 =false;System.out.println(b1 == b2);System.out.println(b1 != b2);}

运行结果如下:
在这里插入图片描述
这里就可以完成比较。

对象的比较

equals

equals 是比较两个对象相不相同。

CompareTo

CompareTo 用来比较大小。在之前实现对对象的比较的时候 ,要实现 Comparable 接口,而且要重写 Comparable 方法才可以比较。

代码如下:

classCardimplementsComparable<Card>{publicint rank;//数值publicString suit;//花色publicCard(int rank,String suit){this.rank = rank;this.suit = suit;}@OverridepublicintcompareTo(Card o){//这里的排序换一下,就变成大堆排序了returnthis.rank - o.rank;}@OverridepublicStringtoString(){return"Card{"+"rank="+ rank +", suit='"+ suit +'\''+'}';}}publicclassMain{publicstaticvoidmain(String[] args){PriorityQueue<Card> priorityQueue =newPriorityQueue<>();
        priorityQueue.offer(newCard(2,"♥"));//
        priorityQueue.offer(newCard(1,"♥"));System.out.println(priorityQueue);}}

运行结果如下:
在这里插入图片描述
因为实现了 Comparable 接口,所以就可以比较了。因为如果不实现 Comparable 接口的话,就会报错,因为无法转化为可以比较的类型。这里的 Comparable 是比较 rank 也就是比较数值,

但是这样写的缺点就是:把类写死了,只能这样通过数值比较。对类的侵入性太强了。所以就可以单独写一个比较器来实现比较方法。

通过比较器比较

实现单独的比较器方法来比较。
代码如下:

classRankComparatorimplementsComparator<Card>{@Overridepublicintcompare(Card o1,Card o2){return o1.rank - o2.rank;}}publicstaticvoidmain(String[] args){Card card1 =newCard(1,"♥");Card card2 =newCard(2,"♥");RankComparator rankComparator =newRankComparator();PriorityQueue<Card> priorityQueue =newPriorityQueue<>();
    priorityQueue.offer(card1);
    priorityQueue.offer(card2);System.out.println(priorityQueue);}

这里就是通过比较器去比较,运行结果如下:
在这里插入图片描述
只要是 o1 - o2 就是小根堆,否则就是大根堆。

直接 new 一个比较器来比较

因为可以在比较的时候使用 new 出来的比较器,那么也可以在使用方法的时候,在方法里面 new 一个比较器。代码如下:

publicstaticvoidmain(String[] args){Card card1 =newCard(1,"♥");Card card2 =newCard(2,"♥");//重写了 Comparator 方法  是一个匿名内部类PriorityQueue<Card> priorityQueue =newPriorityQueue<>(newComparator<Card>(){publicintcompare(Card o1,Card o2){return o1.rank - o2.rank;}});
    priorityQueue.offer(card1);
    priorityQueue.offer(card2);System.out.println(priorityQueue);}

这里通过重写 Compare 方法来实现比较。运行结果如下:
在这里插入图片描述
当然也可以把比较代码简写成这种 lambda 表达式,但是这样的代码的可读性非常差:

PriorityQueue<Card> priorityQueue =newPriorityQueue<>((x, y)->{return y.rank - x.rank;});

重写 equals 方法来比较

当花色和数字一样的时候,我们就认为一样,但是如果不重写 equals 方法的话,就会比较地址,是 false 。在 idea 当中,重写 equals 方法的话,一直下一步就好了。代码如下:

classCardimplementsComparable<Card>{publicint rank;//数值publicString suit;//花色publicCard(int rank,String suit){this.rank = rank;this.suit = suit;}@OverridepublicintcompareTo(Card o){//这里的排序换一下,就变成大堆排序了returnthis.rank - o.rank;}@OverridepublicStringtoString(){return"Card{"+"rank="+ rank +", suit='"+ suit +'\''+'}';}@Overridepublicbooleanequals(Object o){if(this== o)returntrue;if(o ==null||getClass()!= o.getClass())returnfalse;Card card =(Card) o;return rank == card.rank &&Objects.equals(suit, card.suit);}@OverridepublicinthashCode(){returnObjects.hash(rank, suit);}}publicstaticvoidmain(String[] args){Card card1 =newCard(1,"♥");Card card2 =newCard(1,"♥");//不重写 equals 方法的话,默认比较的是引用//重写之后 就是自定义比较了System.out.println(card1.equals(card2));}

运行结果如下:
在这里插入图片描述


本文转载自: https://blog.csdn.net/sjp151/article/details/123142104
版权归原作者 Lockey-s 所有, 如有侵权,请联系我们删除。

“基于堆实现对象比较”的评论:

还没有评论