1. Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。<br /> Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。<br />sort(List list, Comparator c):根据指定比较器产生的顺序对指定列表进行排序,也就是自定义排序,第一个参数是传入的要排序的列表,第二个参数是指定的比较器。<br />例如:将list列表按降序进行排序,代码如下:

首先创建一个比较器,在这个比较器中定义好排序规则(升序或降序),此处为降序排序:

  1. Comparator<Integer> c = new Comparator<Integer>() {
  2. @Override
  3. public int compare(Integer o1, Integer o2) {
  4. // 升序排序 o1 - o2
  5. // 降序排序 o2 - o1
  6. return o2 - o1;
  7. }
  8. };

然后将这个比较器作为一个参数传递进sort方法:

  1. Collections.sort(list, c);
  2. System.out.println("sort降序排序:" + list);

输出结果如下:
image.png
图3

也可以直接在调用sort方法时创建比较器
,代码如下:

  1. Collections.sort(list, new Comparator<Integer>() {//直接在调用sort方法时创建比较器
  2. @Override
  3. public int compare(Integer o1, Integer o2) {
  4. // 升序排序 o1 - o2
  5. // 降序排序 o2 - o1
  6. return o2 - o1;
  7. }
  8. });

只是写法不同,输出结果一致,如图3所示!

原文链接:https://blog.csdn.net/weixin_44578554/article/details/89362331


排序方式

Comparator中的compare方法
正序排列 从小到大

  1. public int compare(int o1, int o2) {
  2. return o1 - o2;
  3. }

逆序排列 从大到小

  1. public int compare(int o1, int o2) {
  2. return o2-o1;;
  3. }

Comparable中的compareTo方法
正序排列 从小到大

  1. @Override
  2. public int compareTo(Test o) {
  3. return this.i - o.i;

逆序排列 从大到小

  1. @Override
  2. public int compareTo(Test o) {
  3. return o.i-this.i ;

Comparable接口的comparaTo方法和上面Comparator接口的compare方法类似,这里的this即上面的o1,o即上面的o2

原文链接:https://blog.csdn.net/qq_43170213/article/details/89388427


强制转换

Student s1 = (Student)o1; //强制转换,使得o1转换成Student类并可以使用方法变量

  1. public class Studentdemo {
  2. public static void main(String[] args) {
  3. TreeSet ts1 = new TreeSet(
  4. new Comparator() {
  5. public int compare(Object o1,Object o2) {
  6. Student s1 = (Student)o1; //强制转换,使得o1转换成Student类并可以使用方法变量
  7. Student s2 = (Student)o2;
  8. return s1.age > s2.age ? 1 : -1;
  9. }
  10. });


原文链接:https://blog.csdn.net/wuya112709/article/details/51407754/