Java常用类—比较器

介绍说明

Java中的对象,正常情况下只能比较: == 或 != , 不能使用 > 或 <
但是在开发场景中,我们需要对多个对象进行排序,我们需要对多个对象进行排序,言外之意就是需要比较对象的大小
使用comparator或者comparable
Comparable接口的使用举例:
1.String、包装类都实现了Comparable接口,重写了compareTo(obj)方法,给出比较两个对象的方法
2.String、包装类重写compareTo()方法以后,进行了从小到大的排列
3.重写compareTo的规则:当前对象大于obj返回正整数,小于返回负整数,等于返回零



自定义类实现Comparable接口来做到自然排序

  • 对于自定义类来说,如果需要排序 Arrays.sort(数组名) ,我们可以让自定义类实现Comparable接口和compareTo(obj)方法
package com.jayerlisten.test;

/**
 * @author JayerListen
 * @create 2022-05-08 2022/5/8
 */
public class Goods implements Comparable{
        private String name;
        private double price;

    public Goods(String name, double price) {
        this.name = name;
        this.price = price;
    }


    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }


    @Override
    public int compareTo(Object o) {
        if(o instanceof Goods){
            Goods goods =(Goods)o;
            if(this.price > goods.getPrice()){
                return 1;
            }else if(this.price < goods.getPrice()){
                return -1;
            }else{
                return -this.name.compareTo(goods.getName());
            }
        }else{
            throw new RuntimeException("传入参数的类型异常!");
        }
    }
}


使用Comparator来实现定制排序

  • 当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了Java.lang.Comaparable接口的排序规则不适合当前的操作,那么可以考虑使用Comparator对象来排序
  • 重写compare(Object o1,Object o2)方法,比较o1和o2的大小
    如果o1大于o2返回正数
    如果o1小于o2返回负数
    如果o1等于o2返回0
Arrays.sort(arr, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //重写代码
                return 0;
            }
        });

Comparable接口和Comparator类的使用对比:

  • Comparable接口在实现之后,固定在类中比较永久的使用比较
  • Comparator类的对象在实现后传入参数中,使用匿名对象则属于临时性的比较
posted @ 2022-05-08 22:28  JayerListen  阅读(140)  评论(0编辑  收藏  举报