首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Java】对象比较大小

【Java】对象比较大小

作者头像
CODER-V
发布2023-03-04 13:44:12
发布2023-03-04 13:44:12
1.7K00
代码可运行
举报
文章被收录于专栏:藏经阁藏经阁
运行总次数:0
代码可运行
  • 在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。
  • Java实现对象排序的方式有两种:
    • 自然排序:java.lang.Comparable
    • 定制排序:java.util.Comparator
  • 规则:需要我们自定义根据对象的某个或某些属性进行排序

1. 方式一:实现Comparable接口

步骤:

  1. 用我们自定义的类A实现Comparable接口
  2. 重写Comparable接口中的compareTo(Object obj)方法,在此方法中声明类A的对象的大小比较规则

重写compareTo(Object obj)方法示例:和重写equals()方法思路类似

代码语言:javascript
代码运行次数:0
运行
复制
	@Override
    public int compareTo(Object o) {
        //1.若实参对象和当前对象地址相同,则时同一个对象
        if (o == this) {
            return 0;
        }

        //2.若实参对象是当属于当前类或子类实例,则强转,声明比较规则
        if (o instanceof A) {

            // 强转
            A p = (A)o;

            // 比较规则:用参2与参1比较。小于return 负数,大于return 整数,相等return 0。
            // 比较规则1,这里注意是谁的compare方法
            int value = Double.compare(this.xxx,xxx);

            // 比较规则2
            if (value != 0) {
                // 从小到大
                // return value;
                // 从大到小
                return -value;
            }
            // 若比较规则1的结果相同,则使用该规则;从从小到大
            return this.xxx.compareTo(p.xxx);
            // 从大到小
            // return -this.xxx.compareTo(p.xxx);
        }

        //3.若实参对象不属于当前类,则抛出类型异常
        throw new RuntimeException("类型不匹配!");

		// 使用示例
		// Arrays.sort(arr实现类对象的实例)
    }

2. 方式二:实现Comparator接口

2.1 为什么有了Comparable还需要Comparator

  • 情况1: 当我们需要对对象进行排序,而对象所在类又没有实现Comparable,我们也没法修改所在类代码的情况下使用。
  • 情况2: 当这个类实现了Comparable接口,但是比较规则不满足我们的需求,而我们又无法修改其源码的时候使用。

因为以上两种情况的存在,我们可以临时的去指定排序方式,于是就有了Comparator。

2.2 实现

步骤:

  1. 在当前类A实现Comparator接口
  2. 重写compare(Object o1, Object o2)方法,在此方法中声明对象的大小比较规则

注意: Comparator的比较规则会覆盖Comparable的比较规则

代码语言:javascript
代码运行次数:0
运行
复制
//1.创建一个实现Comparator接口的实现类对象,这里使用了匿名实现类
Comparator comparator = new Comparator() {

    @Override
    public int compare(Object o1, Object o2) {
        
        //2.若实参对象是当属于当前类或子类实例,则强转,声明比较规则
        if(o1 instanceof A && o2 instanceof A){
			// 强转
			A p1 = (A) o1;
       		A p2 = (A) o2;
			
			// 比较规则:用参2与参1比较。小于return 负数,大于return 整数,相等return 0。
			// 从小到大
			return Double.compareTo(p1.getXxx(),p2.getXxx());
			// 从大到小
			//return -Double.compareTo(p1.getXxx(),p2.getXxx());
		}

        //3.若实参对象不属于当前类,则抛出类型异常
        throw new RuntimeException("类型不匹配!");

		// 使用示例
		// Arrays.sort(arr,comparator类A的实例);
    }
}

3. Comparable VS Comparator

角度一:

  • 自然排序:单一唯一,一旦指定了比较规则就不能更改
  • 定制排序:灵活多样,创建多个Comparator对象,指定不同的比较规则,调用不同的对象即可

角度二:

  • 自然排序:一劳永逸,一旦声明好就可以永久使用
  • 定制排序:在使用的时候才去零时声明

角度三:

  • 自然排序:实现接口Comparable,重写抽象方法compareTo(Object obj)
  • 定制排序:实现接口Comparator,重写抽象方法compare(Object o1, Object o2)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 方式一:实现Comparable接口
  • 2. 方式二:实现Comparator接口
    • 2.1 为什么有了Comparable还需要Comparator
    • 2.2 实现
  • 3. Comparable VS Comparator
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档