java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法
原文地址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;
}
//时间降序 点击量升序 标题降序
@Override
public 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;
}
@Override
public 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> {
@Override
public 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;
}
@Override
public String toString() {
return "title=" + title+",price=" + price +"\n";
}
}
定义比较规则:
/**
* 按照价格的降序排列
*/
public class ProductCompare implements java.util.Comparator<Products> {
@Override
public 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=143432
title=d,price=11092
title=c,price=1892
title=a,price=120
]
}
java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法的更多相关文章
- Java重写equals方法和hashCode方法
package com.ddy; public class User { private Integer id; private String name; private St ...
- Java基础知识强化84:System类之exit()方法和currentTimeMillis()方法
1. exit方法: public static void exit(int status): 终止当前正在运行的Java虚拟机.参数用作状态码:根据惯例,非0的状态码表示异常终止. 调用System ...
- Java 重写hashCode 方法和equals方法
package Container; import java.util.HashSet; import java.util.Iterator; /* Set 元素是无序的(存入和取出的顺序不一定一致) ...
- JAVA正确地自定义比较对象---如何重写equals方法和hashCode方法
在实际应用中经常会比较两个对象是否相等,比如下面的Address类,它有两个属性:String province 和 String city. public class Address { priva ...
- java数组、java.lang.String、java.util.Arrays、java.lang.Object的toString()方法和equals()方法详解
public class Test { public static void main(String[] args) { int[] a = {1, 2, 4, 6}; int[] b = a; in ...
- java中equals方法和hashcode方法的区别和联系,以及为什么要重写这两个方法,不重写会怎样
一.在Object类中的定义为:public native int hashCode();是一个本地方法,返回的对象的地址值.但是,同样的思路,在String等封装类中对此方法进行了重写.方法调用得到 ...
- Object、String、数组的 toString() 方法和 equals() 方法及java.util.Arrays
public class Test { public static void main(String[] args) { int[] a = {1, 2, 4, 6}; int[] b = a; in ...
- Java中实现对象的比较:Comparable接口和Comparator接口
在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...
- Java:实现对象的比较 comparable接口和comparator接口
在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...
随机推荐
- Money型字段小数点后保留两位小数
asp.net直接显示Money型字段小数点后面将保留四位小数,而我们常见的格价显示一般是小数点后两位,如何实现这种效果呢,有如下几种方法: 1.直接型,通过ToString()函数直接格式话 例如把 ...
- IIS7 windows 下安装PHP
首先要下载 php for windows 这个软件,百度一搜一大把. 1.我安装的是5.3.22版,就以这个为例给大家解说一下. 安装就是下一步,下一步,到一个选项 IIS FastCGI 选这个! ...
- python中的list和array的不同之处
原文地址: http://blog.csdn.net/liyaohhh/article/details/51055147#reply python中的list是python的内置数据类型,list中 ...
- Elasticsearch学习之SearchRequestBuilder的query类型
1. 分词的时机 对于ES来讲,可以对文档的内容进行分词(前提是设置了analyzed),也可以对输入的搜索词进行分词.对输入的搜索词进行分词时需要看下使用的什么类型的query.不同的query可能 ...
- 题目1446:Head of a Gang(并查集操作)
题目链接:http://ac.jobdu.com/problem.php?pid=1446 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
- C# SignalR 即时通讯 聊天室
一.SignalR简介 SignalR:当所连接的客户端变得可用时服务器代码可以立即向其推送内容,而不是让服务器等待客户端请求新的数据.实现实时服务器与客户端通信.是一个开源.NET 库生成需要实时用 ...
- 网站测速、ping
1.17ce 2. 360奇云测 3.http://ping.chinaz.com/ 效果图:
- Android 浅谈 设计与屏幕适配 【1.6235449734285716】
extends: http://www.ui.cn/detail/45435.html http://www.2cto.com/kf/201501/372699.html http://www.cnb ...
- iOS - 开源框架、项目和学习资料汇总(其他篇)
数据库 1. FMDB – sqlite的工具, 多线程FMDatabaseQueue实例,FMDB数据库的使用演示和封装工具类.GXDatabaseUtils – 在FMDB基础上的工具.2. re ...
- 关于Django的序列化
阅读目录 Django支持的序列化格式 Django的序列化 Django支持的序列化格式 1 2 3 4 Identifier Information xml Serializes to and f ...