前言:

在实际开发中,经常需要对某些数据进行比较,例如我们在网购的时候,检索某件商品,它会按照价格,收藏等等关键词展示出来,当中的展示规则便是对商品间的某个相同数据比较后所得出来的。

在Java中,数据比较通常用到两个接口:

1、实体类 java.lang.Comparable +compareTo

该接口只有一个实现方法compareTo,一般用于自然排序

compareTo返回有三种结果:即

A.compareTo(B)>0 ,即使A>B
A.compareTo(B)=0 ,即使A=B
A.compareTo(B)<0 ,即使A<B

2、业务定制排序类 java.util.Comparator +compare

该接口提供了一个compare实现方法,广泛应用于自定义业务排序中,它有如下有势:

1)解耦:与实体类分离,出现不同的业务需求时无序改动实体类

2)方便:应对多变的排序规则

来看看具体例子:

①创建实体类Goods:

/***     实体类* @author Jave Chan**/
public class Goods {private String name;  //商品名private double price;    //价格private int fav;    //收藏量public Goods() {super();}public Goods(String name, double price, int fav) {super();this.name = name;this.price = price;this.fav = fav;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrive(double price) {this.price = price;}public int getFav() {return fav;}public void setFav(int fav) {this.fav = fav;}@Overridepublic String toString() {return "Goods: [name=" + name + ", price=" + price + ", fav=" + fav + "]";}}

②创建Comparator接口实现类GoodsPriceComparator,根据价格进行排序:

/***     按价格排序的业务类(降序)* @author Jave Chan**/
public class GoodsPriceComparator implements java.util.Comparator<Goods>{@Overridepublic int compare(Goods o1, Goods o2) {//o2-o1>0==>o2>o1==>返回1,否则做进一步判断,相等返回0,o2-o1<0即o2<01时返回-1return -(o1.getPrice()-o2.getPrice())>0 ? 1:(o1.getPrice()==o2.getPrice()?0:-1);}}

③创建Comparator接口实现类GoodsFavComparator,根据收藏量进行排序:

/***     按收藏量排序的业务类(升序)* @author Jave Chan**/
public class GoodsFavComparator implements java.util.Comparator<Goods>{@Overridepublic int compare(Goods o1, Goods o2) {return o1.getFav() - o2.getFav();}}

④创建排序类GoodsApp,将Comparator对象作为参数传递,添加compare方法中使用的自定义类,实现不修改实体类情况下根据不同情况进行排序,实现解耦

/*** * @author Jave Chan**/
public class GoodsApp {public static void main(String[] args) {List<Goods> list = new ArrayList<Goods>();list.add(new Goods("潮汕牛肉丸", 50.0, 100));list.add(new Goods("潮汕肠粉", 150.0, 200));list.add(new Goods("潮汕功夫茶", 100.0, 120));System.out.println("排序前:" + list);Collections.sort(list, new GoodsFavComparator());  //根据不同喜好排序,不必修改实体类System.out.println("排序后(按收藏量升序):" + list);Collections.sort(list, new GoodsPriceComparator());  //根据价格排序,同上,实现解耦System.out.println("排序后(按价格降序):" + list);}
}

⑤运行结果如下:


总结:

1、Comparable:自然排序,实体类直接实现;

2、Comparator:自制业务排序,在调用方法时直接创建,耦合度低;

3、对于一些引用数据类型,例如包装类,它们都内置实现了Comparable接口中的compareTo()方法,可以直接使用!

以上,是Comparable与Compatator的区别 。

compareto返回1和-1的区别_温故篇:Comparable与Compatator的区别相关推荐

  1. alphac测试和bata测试区别_电缆识别仪与电缆故障测试仪的区别

    湖北中试高测电气控股有限公司为您解答:电缆识别仪与电缆故障测试仪的区别 电缆识别仪与电缆故障测试仪的区别 之前有客户问我,电缆识别仪和电缆故障测试仪是不是也能对电缆进行识别,我想这个用户可能是用过了电 ...

  2. 机器人编程与python语言的区别_儿童编程和机器人编程有啥区别?

    这是最全面的回答!一篇文章让你彻底了解少儿编程和机器人编程的区别! 虽然都带有"编程"二字,但少儿编程和机器人编程还是有本质区别的,有哪些不一样呢? 偷懒的家长可以直接看下面这张表 ...

  3. alphac测试和bata测试区别_康一康!接口测试与性能测试的区别瞧过来~

    点击上方蓝字  关注我们前言 最近我在一个论坛上看到了一个关于性能测试和接口测试的经典问题,问题如下: 问题:后端性能测试,一个功能其实都是由后台多个接口组成的. 例如一个单据的保存,可能后台需要调用 ...

  4. 用法与区别_指示代词this, that, these, those的区别和用法

    今天学习指示代词this, that, these和those的用法. 先来看包括this和that的2个句子. 图片来源于网络 我们看图片中手和物品的距离. 在左边的图片中, 苹果就在手边,这个人指 ...

  5. 设置为true有什么区别_腻子粉和腻子膏到底有什么区别,腻子粉厂家来为你讲解...

    装修中腻子是常见的一种涂料吗,在涂刷底漆之前一定要使用腻子膏或腻子粉,这样才能使后续涂装效果更好.不少业主有疑问,装修用腻子膏好,还是用腻子粉好?二者区别在哪呢?下面,就由腻子粉厂家来为你分析 一. ...

  6. esxi 6.7 7.0 区别_摩托车国产车和合资车有什么区别?

    本文内容的国产车主要指自主品牌,因为严格意义上来说,国产车它既包括自主品牌也涵盖了合资品牌,我们口中所说的国产车是相对于进口车而言,它们两者之间最大的区别就是产地,正因为产地的差异使得实车就出现了一些 ...

  7. 货物与产品的区别_详解海外仓与保税仓的区别特点!

    海外仓分两种,一种是跨境进口电商的海外仓,一种是跨境出口电商的海外仓. 同是在境外建立的仓库,跨境出口电商是将国内的商品储存在海外仓,国外的消费者下单后直接从海外仓快速.而跨境进口电商是将国外的商品储 ...

  8. 地域和地方的区别_商标、品牌、LOGO,三者区别在哪里?

    不知道,大部分人是否和我一样,一开始对logo.商标.品牌这几个词分的并不是很清楚,常常觉得他们是一件东西,经专业人士指点迷津,菜发现,一直以来,我都是对logo先入为主,一厢情愿地认为logo就是该 ...

  9. comparable接口和comparator接口的作用和区别?_接口和抽象类有什么联系和区别?

    春风如贵客,一到便繁华.各位看官点赞再看,养成好习惯(●´∀`●)之后还会推出JAVA面试系列文章,敬请关注!按照技术模块:Java热点技术.多线程.微服务.JVM.Redis.消息队列.SQL相关的 ...

最新文章

  1. linux下目录的个个文件夹含义
  2. JavaScript表达式--掌握最全的表达式,一切尽在掌握中,让表达不再是难事
  3. 每天一道LeetCode-----最长回文子串/序列,从头开始的最长回文子串长度
  4. opencv+pythons相机标定源码解析
  5. 【新功能】媒体处理MPS全新支持自适应多码率、多语言音轨
  6. 三个变量中怎么找出中间值_scratch图形化编程基础练习-变量交换
  7. 算法工程师,『工程』二字怎么破?
  8. netty 使用阻塞发送_「解」互联网大厂Java面试题——Netty 面试题解析
  9. 光在参与介质中的传播及辐射传递方程
  10. 记录学习算法心得(时间复杂度和空间复杂度)
  11. 商务统计分析(第3章 数据描述)
  12. 在win10电脑上搭建私有区块链
  13. 机器人工程师技术资料
  14. 珠海到各大机场的线路
  15. 机器学习:多重共线性
  16. python支持向量机SVM (sklearn)
  17. QQ浏览器如何启用无痕模式
  18. 计算机专业用什么轴的键盘,机械键盘什么轴好
  19. Python数据分析第八课:初识Matplotlib
  20. step by step 构建嵌入式Linux系统平台

热门文章

  1. fmri|SPM contrast manager
  2. C#中break 和 continue 和 return在if语句和for循环中的区别
  3. 光华股份在深交所上市:市值突破51亿元,前三季度收入约10亿元
  4. [DIV/CSS] 用CSS和JS打造一个简单的图片编辑器
  5. php类中遍历中的rewind方法,PHP rewind( )用法及代码示例
  6. 女人眼中最美的七种男人……
  7. 项目笔记——简易RPC框架(待升级)
  8. Word利用Aurora插入伪代码
  9. 字符集本地化(locale)与输入法系列讲座-----(3) truetype造字程序详解
  10. c语言求n个数最大最小值,c语言 如何求n个数的最大值 最小值