1.Comparator接口的使用
今天学习了java.utils包下的Comparator接口。该接口代表一个比较器。 提到比较的接口, 你一定会想起来Comparable。这个俩个接口都有比较的作用。
提到了comparable接口, 就要介绍一下这两个接口的区别。
从字面意思区别这个俩个接口的话, 如下:
- comparator 翻译过来是比较**器 **, 即比较的器具,工具。
- comparable 翻译过来是可比的, 是一个修饰词, 修饰词就是修饰事物的, 即使某个物具有可比性。
这样,你大体对这两个接口的使用方法和区别有了初步的了解。
1.1.该接口的作用
我们回到我们的Comparator
,该接口代表一个比较器。java数组工具类和集合工具类中提供sort方法的排序就是使用该接口来处理的。
Arrays.sort(T[],Comparator<? super T> c); #数组工具类sort
Collections.sort(List<T> list,Comparator<? super T> c); #集合工具类sort
1.2.使用场景
通常用到比较的地方就是 **排序 **, 排序一般比较的是>
、<
、=
。
此外, 还有些地方比较的是=
或者!=
。
1.3.接口常用的方法
compare、 和equals 是用俩个常用方法, 因此实现该接口, 一般就重写这两个方法。
其中compare是比较参数顺序, 就是在排序时使用的。
equals是我们上面说到的比较是否想等。
1.4. 常用方法详细介绍
1.4.1.遵守的规则
我这里只介绍compare方法, 这个方法是用来比较俩个参数的顺序的。文档给出的介绍如下:
文档中提到了实现compare必须要遵守三个性质:
-
相反性:
sgn(compare(x, y)) == -sgn(compare(y, x))
所有x
和y
。我们这里称呼这个为相反性吧,这个形式很好理解 -
传递性:实施者还必须确保关系是可传递的:
((compare(x, y)>0) && (compare(y, z)>0))
意味着compare(x, z)>0
。 -
最后就是对
compare(x, y)==0
的解释: 如果他们x y满足compare(x, y)==0
, 他们俩与任意一个z 的比较结果想等。
这是官方提出要遵守的几条规则, 所以我们在编写时注意遵守一下就是了。
注意:以上的相反性是我个人为了便于理解, 而对它的称呼。
1.4.2.返回值
上面我呢介绍了编写该方法索要遵守的规则, 下面我们提一下返回值。
该方法返回值为int ,分三种:
- 正数
- 0
- 负数
因为排序有多种, 并不是返回什么值就要交换, 它只是定义了一个升降的规则。升序和降序的实现, 如下。
1.5. 升序和降序的实现
-
升序
public int compare(T u1, T u2) { if(u1 > u2) return 1; if(u1 < u2) return -1