1,两种接口的展示

下面的程序是两个类各自实现了Comparable接口、Comparator接口

package com.cnblogs.mufasa.Solution;

import java.util.Comparator;

class Solution1 implements Comparable<Solution1>{
int val;
public Solution1(int val){
this.val=val;
} @Override
public int compareTo(Solution1 o) {
return val-o.val;
}
} class Solution2 implements Comparator<Solution2> {
int val;
public Solution2(int val){
this.val=val;
} @Override
public int compare(Solution2 o1, Solution2 o2) {
return o1.val-o2.val;
}
} public class Client{
public static void main(String[] args) {
Solution1 sl1=new Solution1(5);
Solution1 sl2=new Solution1(1);
System.out.println("sl1.compareTo(sl2):"+sl1.compareTo(sl2)); Solution2 sl21=new Solution2(5);
Solution2 sl22=new Solution2(1);
System.out.println("sl21.compare(sl21,sl22):"+sl21.compare(sl21,sl22));
System.out.println("sl21.compare(sl21,sl22):"+sl21.reversed().compare(sl21,sl22));
}
}
/*
sl1.compareTo(sl2):4
sl21.compare(sl21,sl22):4
sl21.compare(sl21,sl22):-4
*/

2,两种接口的比较

  通过上面的展示程序,我们可以发现这两个接口实现起来都很简单,并且实现的逻辑都基本一样。但是差别还是有的!

  上面是我总结的一些各自的相同点与不同点。

3,各自优缺点

  Comparable实现简单、功能纯粹单一;Comparator实现可简单可复杂,可以在进行Collections.sort()以及Arrays.sort()中临时实现这个接口,并且实现方式还花里胡哨的【函数式编程、直接比较等等】

package com.cnblogs.mufasa.Solution2;

import java.util.Arrays;
import java.util.Comparator; public class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
} @Override
public int compareTo(Person o) {//先按照姓名的字典序排序,再按照年龄的由小到大排序
String ab=name+o.name;
String ba=o.name+name;
int len=ab.length();
for(int i=0;i<len;i++){
int temp=ab.charAt(i)-'0'-ba.charAt(i);
if(temp<0){
return -1;
}else if(temp>0){
return 1;
}
}
return age-o.age;
} public String getName() {
return name;
} public int getAge() {
return age;
}
} class Client{
public static void main(String[] args) {
Person[] ps=new Person[6];
ps[0]=new Person("Mufasa",22);
ps[1]=new Person("Mufasa",18);
ps[2]=new Person("Wanyu",24);
ps[3]=new Person("Guoyahong",24);
ps[4]=new Person("Guoyahong",26);
ps[5]=new Person("Admin",26); for(Person p:ps){
System.out.print(p.getName()+","+p.getAge()+"\t");
}
System.out.println(); // Arrays.sort(ps);//使用自带的Comparable可以直接实现
// Arrays.sort(ps,Comparator.comparing(Person::getName).thenComparing(Person::getAge));//使用Comparator验证成功
// Arrays.sort(ps,Comparator.comparing(Person::getName).thenComparing(Person::getAge).reversed());//使用Comparator进行反转reversed,整体反转
// Arrays.sort(ps,Comparator.comparing(Person::getName).reversed().thenComparing(Person::getAge));//使用Comparator进行反转reversed,部分反转1
Arrays.sort(ps,Comparator.comparing(Person::getName).reversed().thenComparing(Person::getAge).reversed());//使用Comparator进行反转reversed,部分反转2 // Arrays.sort(ps,(a,b)->{//利用Comparator接口的简化函数式编程,平时我使用的就是这个简单易用
// String ab=a.getName()+b.getName();
// String ba=b.getName()+a.getName();
// int len=ab.length();
// for(int i=0;i<len;i++){
// int temp=ab.charAt(i)-'0'-ba.charAt(i);
// if(temp<0){
// return -1;
// }else if(temp>0){
// return 1;
// }
// }
// return a.getAge()-b.getAge();
// }); for(Person p:ps){
System.out.print(p.getName()+","+p.getAge()+"\t");
}
System.out.println();
}
}

4,应用领域

  一般情况下,我们默认使用Comparable接口【优先选择】,主要是因为这种比较方法简单易实现,并且功能纯粹;

  如果Comparable实现的比较功能,我们自己不满意想要临时更改,那么花里胡哨的Comparator就闪亮登场了,这个功能多,并且低耦合度,我们可以使用的时候随意进行调整,并且还可以【把多个Comparator链在一起】去实现更加复杂的比较逻辑!

list.sort(Comparator.comparing(Employee::getSalary).thenComparing(Employee::getName));//多个Comparator链接组合成复杂排序-层级排序

5,参考链接

https://www.cnblogs.com/szlbm/p/5504634.html

https://blog.csdn.net/bitcarmanlee/article/details/73381705

最新文章

  1. vc6.0如何显示行号以及出现版本不兼容问题
  2. 处于同一个域中的两台Sql server 实例无法连接
  3. AbstractMap学习记录
  4. SQL Server 2008 定时作业的制定(SQL2005参考此方法) 转
  5. 6.24AppCan移动开发者大会价值30万的展示机会归了谁?
  6. Fatal error: Using $this when not in object context in 解决方法
  7. C++访问声明
  8. Linux:备份
  9. 还原NuGet程序包
  10. ViewPagerIndicator+viewpager指示器详解
  11. bat脚本+diskpart 脚本实现自动划分磁盘分区
  12. Introduction to Parallel Computing
  13. spring multipart源码分析:
  14. spring_AOP
  15. Tomcat 配置详解和优化
  16. 遇到问题或bug时要做的事。
  17. 不固定个数组,进行一一对应的组合,js将多个数组实现排列组合
  18. Java == 和 equals 区别
  19. 关于运行“基于极限学习机ELM的人脸识别程序”代码犯下的一些错误
  20. js &amp; replaceAll &amp; Regex

热门文章

  1. Linux命令:ipcs/ipcrm命令
  2. Unexpected token o in JSON at position 1 报错原因
  3. C++操作Mysql数据库/Linux下
  4. LF: 换行,U+000A VT: 垂直定位,U+000B FF: 换页符,U+000C CR: 回车符,U+000D CR+LF:CR(U+000D)后跟LF(U+000A) NEL: 下一行,U+0085 LS: 分行,U+2028 PS: 分段,U+2029
  5. 主外键 设置 on update cascade 和on delete cascade 的区别
  6. ubuntu上的 /dev/loop0 到 /dev/loop18占到100%的处理
  7. 1. Tomcat之startup.sh
  8. 【问题解决】Flasgger mapping values are not allowed here?
  9. C#操作Access时Parameters集合的使用方法(转)
  10. HR数据分析常用的50个公式