Java 比较器 和 包装类

2024-08-06 14:17:23 浏览数 (2)

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 所以


	

0 人点赞