java对象的比较 Comparable和 Comparator

2022-08-06 09:27:46

Comparable和 Comparator的联系
Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

一、Comparable-基于自然顺序

Comparable 简介

Comparable 是排序接口
若一个类实现了Comparable接口,就意味着“该类支持排序”。此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。
接口中通过x.compareTo(y)来比较x和y的大小。若返回负数,意味着x比y小;返回零,意味着x等于y;返回正数,意味着x大于y。

官方api:

publicinterfaceComparable<T>{// 返回值:// < 0: 表示 this 指向的对象小于 o 指向的对象// == 0: 表示 this 指向的对象等于 o 指向的对象// > 0: 表示 this 指向的对象等于 o 指向的对象publicintcompareTo(T o);}

【规范】类型形参一般使用一个大写字母表示,常用的名称有:
E 表示 Element
K 表示 Key
V 表示 Value
N 表示 Number
T 表示 Type
S, U, V 等等 - 第二、第三、第四个类型

具体例子:

//实例化一个扑克牌类,包括点数和花色。实现Comparable接口,对象类型为poke。publicclasspokeimplementsComparable<poke>{publicint rank;public String suit;publicpoke(int rank,String suit){this.rank= rank;this.suit= suit;}//重写compareTo方法,传入参数为poke,取数值进行比较,不管花色//返回值当前牌的点数减要比较牌的点数,这里我们认为 null 是最小的@OverridepublicintcompareTo(poke o){if(o== null)return0;// == 0,表示牌相等// < 0,表示 p 比较小// > 0,表示 q 比较大return rank- o.rank;}publicstaticvoidmain(String[] args){
        poke p=newpoke(1,"♠");
        poke q=newpoke(2,"♠");
        poke o=newpoke(1,"♠");
        System.out.println(p.compareTo(o));
        System.out.println(p.compareTo(q));
        System.out.println(q.compareTo(p));}}
0-11

二、 Comparator - 基于比较器

Comparator 简介

Comparator 是比较器接口。 我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。

int compare(T o1, T o2)和上面的x.compareTo(y)类似,定义排序规则后返回正数,零和负数分别代表大于,等于和小于。
官方api:

/**
     * @param o1 the first object to be compared.
     * @param o2 the second object to be compared.
     * @return a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.
     * */publicinterfaceComparator<T>{intcompare(T o1, T o2);}

具体例子

import java.util.Comparator;//一个扑克牌类,包括点数和花色。publicclasspoke{publicint rank;public String suit;publicpoke(int rank, String suit){this.rank= rank;this.suit= suit;}publicstaticclasspokecompareimplementsComparator<poke>{@Override// 返回值:// 0,表示牌相等// < 0,表示前者比较小// > 0,表示前者比较大publicintcompare(poke o1, poke o2){if(o1== o2)return0;if(o1== null)return-1;if(o2== null)return1;return o1.rank- o2.rank;}}publicstaticvoidmain(String[] args){
        poke p=newpoke(1,"♠");
        poke q=newpoke(2,"♠");
        poke o=newpoke(1,"♠");//比较器。包括重写的compare(poke o1, poke o2) 比较方法
        Comparator<poke> compare=newpokecompare();
        System.out.println(compare.compare(o, q));
        System.out.println(compare.compare(o, p));
        System.out.println(compare.compare(q, p));}}
-101

比较

在这里插入图片描述

  • 作者:小小白ovo
  • 原文链接:https://blog.csdn.net/qq_41437542/article/details/109000333
    更新时间:2022-08-06 09:27:46