Java比较器
背景:
在Java中经常会涉及到多个对象的排序问题,那么就涉及到对象之间的比较
- Java中的对象, 正常情况下, 只能进行比较
==
比较对象地址值,是否相同!=
比较对象地址值,是否相同,取反~ 不能使用 > 或 < 的 - 但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小
- 以 JD 商城举例场景: 查询商品可以对商品进行:
价格 销量 评论 购买数...排序
实际上这里面是查询每一个商品都是一个个商品对象
对象属性:商品名 评论数 价格 销量 店铺 图片地址...
- 根据用户点击,从数据库中查询到一个
商品对象/数组
进行排序,返回数据给前端进行排序展示~当然, 一个功能可以有很多种实现方式, 也有直接在数据库中根据传过来的类型, 动态sql 直接在数据库中查询返回排好序的数据!
Java实现对象排序:
- 这里主要介绍,以Java方式实现的对象排序…
- Java实现对象排序的方式有两种: 自然排序: Java.lang.Comparable 定制排序: Java.util.Comparator
自然排序:Java.lang.Comparable 看牌啊爆
Java Comparable接口强行对实现它的每个类的对象进行整体排序 这种排序被称为:自然排序
- Java类, 实现
implements
Comparable接口,重写compareTo(Object o); 的方法;
- 两个对象即通过
compareTo(Object o)
方法的返回值来比较大小 如果当前对象 this 大于形参对象 o ,则返回正整数 1 如果当前对象 this 小于形参对象 o ,则返回负整数 -1 如果当前对象 this 等于形参对象 o ,则返回零 0 - 实现
Comparable
接口的类的对象数组(和有序集合)可以通过 Arrays.sort(和 Collections.sort )进行自动排序 - Comparable的典型实现
**String、包装类等实现了Comparable接口,重写了compareTo(obj)方法 **
默认都是从小到大排序
String:按照字符串中字符的Unicode值进行比较 Character:按照字符的Unicode值来进行比较 数值类型对应的包装类以及BigInteger、BigDecimal:按照它们对应的数值大小进行比较 Boolean:true 对应的包装类实例大于 false 对应的包装类实例true.compareTo( false); —返回—> 1
Date、Time等:后面的日期时间比前面的日期时间大2021.compareTo( 2020 ); —返回—> 1
String、包装类实现 Comparable接口 Demo
ComparaTest.Java
代码语言:javascript复制package com.wsm.comparatest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class ComparaTest {
//Java String、包装类等实现了Comparable接口
public static void main(String[] args) {
//String 类实现了, Comparable 接口!并且实现Comparable 接口!可以直接使用: Arrays.sort Collections.sort 进行排序!
String[] arr = new String[]{"AA","cc","ac","dd","aa","FF","ff"};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); //[AA, FF, aa, ac, cc, dd, ff]
//Char 的包装类, Character 实现Comparable 接口!按照字符的Unicode值来进行比较;
char a = 'a';
char b = 'b';
System.out.println("a=" (int)a "n" "b=" (int)b);
Character aC = 'a';
Character bC = 'b';
System.out.println(aC.compareTo(bC)); // a<b = -1
//Boolean 包装类实现了, Comparable 接口!
Boolean ok = true;
Boolean no = false;
System.out.println("Boolean类型: true > false:" ok.compareTo(no));
//int 等基本数据类型的包装类实现了, Comparable 接口!
Integer one = 1;
Integer two = 2;
System.out.println("基本数据类型包装类比较,直接根据值进行比较:" one.compareTo(two));
//Data 日期类型实现, Comparable 接口!
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
Date thisYear = null;
Date lastYear = null;
try {
thisYear = sdf.parse("2021");
lastYear = sdf.parse("2020");
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println("日期类型比较,最近的日期最大:" thisYear.compareTo(lastYear));
}
}
自然排序Demo
Commodity.Java
定义一个商品类:
代码语言:javascript复制/**
* 创建一个商品类;
*/
public class Commodity implements Comparable {
//商品名
private String name;
//商品价格
private int price;
//商品销量
private int sales;
//点赞数
private int like;
//...更多不举例子了...
/** 实现implements Comparable接口,重写 compareTo(Object o)类 */
/** 指明商品比较大小的方式:按照价格从低到高排序,再按照产品名称从高到低排序 */
@Override
public int compareTo(Object o) {
// instanceof: 判断传入参数类型是否是 商品类型,进入if 进行比较!
if(o instanceof Commodity){
// Object 类型强制转换,父类向下转换!
Commodity o1 = (Commodity) o;
if(this.price > o1.price){ //如果当前对象 大于> 传入对象返回 1;
return 1;
}else if(this.price < o1.price){ //如果当前对象 小于< 传入对象返回 -1;
return -1;
}else { //相等则在进行判断...移此类推返回 0;
//return 0; //相等,应该返回0 但我们还需要进行判断商品名称从高到底~
//因为商品名称是 String类型, String 本身已经实现了 comparable 所以