这篇来介绍自定义类型对象的比较方法,利用Comparable 接口和 Comparator 接口。
目录
问题引入:
一、Comparable 接口
1.1比较学生的年龄
方法:
结果:
1.2比较学生的姓名
方法:
结果:
1.3 案例再展示( Arrays.sort(students))
1.3.1实验 short 排序
1.3.2.异常报告
1.3.3得出结论:
1.4 Comparable 接口的缺点
二、比较器 Comparator 接口
2.1比较学生的年龄
2.2 比较学生姓名
2.3 案例再展示 比较器( Arrays.sort(students))
三、对比 Comparable 接口和 Comparator 接口
问题引入:
如果我们要比较两个整型的值,我们直接输出就好。
但是当我们想比较两个学生,创建类去实例化,实例化后,可以比较对象的引用吗?这显然不可以,这样直接比没有任何意义
问题就来了:
自定义类型怎么比较?
规则怎么制定?
一、Comparable 接口
Comparable接口是一个泛型(要比较什么类型,就把类名传入)接口,用于定义对象的排序规则。该接口中只有一个方法compareTo(),用于比较这个对象与另一个对象的大小关系。
compareTo()方法的如下: int compareTo(T obj)
用法:
compareTo()方法返回一个整数值,表示当前对象与参数对象的大小关系:
- 如果返回值小于0,表示当前对象小于参数对象;
- 如果返回值等于0,表示当前对象等于参数对象;
- 如果返回值大于0,表示当前对象大于参数对象。
Comparable接口需要实现类重写compareTo()方法,根据对象的某个属性或多个属性进行比较,从而确定对象的大小关系。
有了上面的介绍,我们来实现一下Comparable接口 重写comparto 方法
1.1比较学生的年龄
方法:
结果:
1.2比较学生的姓名
方法:
结果:
表明zhangsan大于lisi(只是字符串长度的比较)
1.3 案例再展示( Arrays.sort(students))
1.3.1实验 short 排序
利用 Arrays.sort(students)排序,直接就排序好了数组,真神奇,它怎么知道我想按年龄排的,其实这个方法背后也离不开Comparable接口 comparto 方法,当我们不再实现接口和方法,再运行
1.3.2.异常报告
报告了异常,类型转换异常,我们看看源码
1.3.3得出结论:
自定义类型涉及到大小的比较,现阶段一定要实现Comparable接口
1.4 Comparable 接口的缺点
我们每次比较不同的属性都要修改comparto 方法,这种方法适合固定的属性比较,好麻烦有什么办法吗?
二、比较器 Comparator 接口
比较器(Comparator)是Java中一个接口,用于定义两个对象之间的比较规则。它通常用于排序算法中,使得对象可以按照自定义的规则进行排序。
比较器接口中只有一个方法:compare(Object o1, Object o2),该方法用于比较两个对象。返回一个负整数、零或正整数,表示o1小于、等于或大于o2。根据返回值的不同,可以确定两个对象的相对顺序。
比较器的使用可以实现灵活的排序规则,不依赖于对象的自然排序。它可以按照不同的属性、不同的顺序进行排序,同时也可以处理特定的比较需求,例如忽略大小写比较字符串等。
我们上面使用Comparable接口,每次要重新写比较的方法,来看看 Comparator 接口怎么改善
2.1比较学生的年龄
2.2 比较学生姓名
2.3 案例再展示 比较器( Arrays.sort(students))
三、对比 Comparable 接口和 Comparator 接口
总的来说,Comparable接口是对象自身的比较逻辑,Comparator接口是一个独立的比较器,可以在不同的排序方式下进行比较。