原文地址https://segmentfault.com/a/1190000005738975

实体类:java.lang.Comparable(接口) + comareTo(重写方法),业务排序类 java.util.Comparator(接口) + compare(重写方法).

这两个接口我们非常的熟悉,但是 在用的时候会有一些不知道怎么下手的感觉,现在用案例进行总结,消除对这个知识点的理解盲区(个人的理解,如果有错误 请多多指教)。
一,在实际的需求中,我们需要根据对象的各种属性(标题,时间,点击率,销售额...)进行排序(升序,降序),可以在数据库的sql上进行处理,但是 不是每一个场景 都适合在sql上进行处理,我们有时候需要在程序根据不同的属性,对一个对象进行各种排序 通过页面呈现给用户。
下面有这样的一个需求,一种商品(商品名,销售量,生产日期),根据生产日期降序 销售量升序 商品名称降序

思路:首先按照日期降序,如果日期相同 按照销售量升序,如果销售量相同,按周商品的名称降序
1,创建需要比较的对象的java bean
创建 Bean的快捷键:
1),带参数的构造器:// Shift + Alt + S -->O
2),不带参数的构造器: //Alt + / 生成空的构造方法
3),生成 get set方法:// Shift + Alt + S --> R + Table + Enter + Shift +Table -->Enter

/*** 商品po类*/
public class Items implements java.lang.Comparable<Items> {private String title;private int hits;private Date pubTime;public Items() {}public Items(String title, int hits, Date pubTime) {super();this.title = title;this.hits = hits;this.pubTime = pubTime;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public int getHits() {return hits;}public void setHits(int hits) {this.hits = hits;}public Date getPubTime() {return pubTime;}public void setPubTime(Date pubTime) {this.pubTime = pubTime;}//时间降序 点击量升序 标题降序
    @Overridepublic int compareTo(Items o) {int result = 0;//按照生产时间降序result = - this.pubTime.compareTo(o.pubTime);if(0==result){//如果生产时间相同 就按照销售量升序排列result = this.hits-o.hits;if(0==result){//如果销售量相同 按照名字降序排列result = - this.title.compareTo(o.title);}}return result;}@Overridepublic String toString() {StringBuilder sb = new StringBuilder();sb.append("商品名称").append(this.title);sb.append("销售量").append(this.hits);sb.append("生产时间").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.pubTime)).append("\n");return sb.toString();}}

2,造数据,比较

    //时间降序, 销售量升序, 标题降序
public static void main(String[] args) {List<Items> item = new ArrayList<Items>();item.add(new Items("abcitems",30,new Date(System.currentTimeMillis()-1000*60*60)));item.add(new Items("abcfgitems",30,new Date(System.currentTimeMillis()-1000*60*50)));item.add(new Items("abcditems",100,new Date()));item.add(new Items("abefNews",50,new Date(System.currentTimeMillis()-1000*60*60)));System.out.println("----------排序前----------");System.out.println(item);System.out.println("----------排序后----------");Collections.sort(item);System.out.println(item);
}

二,Comparator的应用场景
一般比较字符串是按照unicode的大小进行排序的,但是我需要按照字符串的长度进行排序,下面是实现的案例:
首先,定义比较的业务规则

/*** 定义业务的比较规则,我需要按照字符串的长度进行比较(在实际的场景中,可以根据业务的需求,灵活的改变比较规则,实现排序)*/
public class CompareString implements java.util.Comparator<String> {@Overridepublic int compare(String o1, String o2) {int len1 = o1.length();int len2 = o2.length();return -(len1-len2);//需要按照降序排列
    }
}

比较 字符串的长度,按照 降序排列

    public static void main(String[] args) {List<String>  list = new ArrayList<String>();list.add("abc");list.add("abcd");list.add("ab");list.add("abd");Collections.sort(list,new CompareString());System.out.println(list);//[abcd, abc, abd, ab]}

比如 商品,我需要按照价格的降序排列,代码如下:
商品 po类

/*** 商品po类*/
public class Products {private String title;private int price;public Products() {}public Products(String title, int price) {super();this.title = title;this.price = price;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}@Overridepublic String toString() {return "title=" + title+",price=" + price  +"\n";}
}

定义比较规则:

/*** 按照价格的降序排列*/public class ProductCompare implements java.util.Comparator<Products> {@Overridepublic int compare(Products o1, Products o2) {return -( o1.getPrice()-o2.getPrice()>0?1: (o1.getPrice()==o2.getPrice()?0:-1));}}

数据比较:

public static void main(String[] args) {List<Products> product = new ArrayList<Products>();product.add(new Products("a",120));product.add(new Products("b",143432));product.add(new Products("c",1892));product.add(new Products("d",11092));Collections.sort(product,new ProductCompare());System.out.println(product);结果:[title=b,price=143432title=d,price=11092title=c,price=1892title=a,price=120]}

转载于:https://www.cnblogs.com/111testing/p/9158140.html

java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法相关推荐

  1. 实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法

    实体类:java.lang.Comparable(接口) + comareTo(重写方法),业务排序类 java.util.Comparator(接口) + compare(重写方法). 这两个接口我 ...

  2. Java基础语法:重写equals方法和hasCode方法

    目录 一.为什么需要重写equals和hasCode方法 二.equals和hasCode解读 1.equals方法 2.hasCode方法 三.重写 四.参考资料 一.为什么需要重写equals和h ...

  3. java重写6,java重写equals()方法和hashCode()方法

    1.equals()方法和hashCode()方法是什么? equals()和hashCode()都是是Java中万物之源Object类中的方法: equals方法用于比较两个对象是否相同,Objec ...

  4. JAVA正确地自定义比较对象---如何重写equals方法和hashCode方法

    在实际应用中经常会比较两个对象是否相等,比如下面的Address类,它有两个属性:String province 和 String city. public class Address {privat ...

  5. java中重写hashcode_Java中HashSet要重写equals方法和hashCode方法

    下面给出一个属性不同但哈希码相同的例子: import java.util.HashSet; import java.util.Iterator; import java.util.Set; clas ...

  6. Java语言-70:UDP编程加入send()方法和receive()方法

    1.send(DatagramPacket p) 从此套接字发送数据报包 2.receive(DatagramPacket p) 从此套接字接收数据报包. 3.简单举例: 数据接收程序: //数据发送 ...

  7. Java基础之Comparable接口和Comparator接口的比较

    前言 就是普普通通的写这么一篇文章,java集合类估计java程序猿都知道,那就写一点小众的. 在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那 ...

  8. Java中的冒泡排序,Comparator接口和Comparable接口的简单使用

    冒泡排序 冒泡排序是一种常见的排序方法,按照一定的规则(比如从小到大或者从大到小的顺序)对一组数据进行排序.而在Java开发中,也经常用到冒泡排序.我们就以下面的一个例子来讲解冒泡排序算法. 给定一个 ...

  9. Comparable接口和Comparator接口

    目录 1 介绍 2 Comparable接口 3 Comparator接口 4 总结 1 介绍 有这样2个人,一个人光头,一个人有黑色头发,现在不允许染发,只允许光头的带假发,理由是有头发的人没有必要 ...

最新文章

  1. Python十大装腔语法
  2. BZOJ2055 80人环游世界
  3. 《用户至上:用户研究方法与实践(原书第2版)》一 3.4 法律层面的考虑
  4. 【Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )
  5. [转]Ubuntu远程桌面登陆
  6. leetcode 494. 目标和
  7. EL表达式的11个内置对象
  8. android 默认浏览器 视频播放 二维码,Android调用系统默认浏览器访问的方法
  9. VUE axios发送cookie
  10. python怎么读取txt文件-python怎么读取txt文件内容
  11. 显示多文档标签_办公小技巧:用好WPS 2019文件名标签
  12. 计算机网络数据链路层之使用点对点信道
  13. 70道经典Android面试题加答案--重要知识点几乎都涉及到了
  14. tgp饥荒服务器mod文件在哪,wegame饥荒联机版mod在那个文件夹 | 手游网游页游攻略大全...
  15. 软件测试项目案例哪里找?【银行/教育/商城/金融/等等....】
  16. Hystrix学习——(2)雪崩效应
  17. 概率统计Python计算:全概率公式
  18. 威联通使用Typecho搭建博客
  19. 嵌入式开发<串口调试工具>
  20. python_17(sql)

热门文章

  1. cypress测试框架与selenium_selenium自动化测试框架之PO设计模式
  2. 使用高级程序设计语言实现集合的交并差运算
  3. 『ACM--算法--KMP』信息竞赛进阶指南--KMP算法(模板)
  4. 轻量级网络之mobilenet_v1
  5. 图数据集之cora数据集介绍 --- 适用于GCN任务
  6. Eigen密集矩阵求解 2 - 求解最小二乘系统
  7. 变形金刚2_变形金刚(
  8. Kotlin 第三讲——集合篇1
  9. glibc、uclibc的区别
  10. proteus跑马灯仿真_不花费一分钱,实现跑马灯编程实验