Java 关于重写compareTo方法

Java 关于重写compareTo方法概述”当一个类实现类Comparable接口,此类就可以跟很多泛型算法(genericalgorithm)以及依赖于该接口的集合实现(Collectionimplementation)进行协作”比如:字母排序,按数字排序,年代排序等等某种**定制排序**Comparable接口publicinterfaceComparable{intcompareTo(Tt);}int

大家好,又见面了,我是你们的朋友全栈君。

概述

"当一个类实现类Comparable接口,此类就可以跟很多泛型算法(generic algorithm) 以及依赖于该接口
的集合实现(Collection implementation)进行协作"

比如:字母排序,按数字排序,年代排序等等某种**定制排序**

Comparable接口

public interface Comparable<T>{
int compareTo(T t);
}

int compareTo(T t)方法说明

定义:比较此对象与指定对象的顺序。
返回:负整数、零或正整数。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。

升序/降序

int result = obj1.compareTo(obj2);

假如result返回1。Collections.sort(List)方法就是升序;
假如result返回-1。Collections.sort(List)方法就是降序;


代码示例:

第一种:

对多个关键域,顺序比较

package com.sta;

public class Student implements Comparable<Student> { 
   
    private int age;
    private float height;
    private String name;

    ......

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + Float.floatToIntBits(height);
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        if (obj == this) {
            return true;
        }
        if (obj != null && obj instanceof Student) {
            Student student = (Student) obj;
            return student.age == this.age && Float.floatToIntBits(student.height) == Float.floatToIntBits(this.height)
                    && (this.name == null ? student.name == null : this.name.equals(student.name));
        }
        return false;
    }

    **@Override
    public int compareTo(Student student) {
        // TODO Auto-generated method stub
        if(this.age > student.age){
            return 1;
        } 
        if(this.age < student.age){
            return -1;
        }
        if(this.height>student.height){
            return 1;
        }
        if(this.height<student.height){
            return -1;
        }
        return this.name.compareTo(student.name);
    }**
}   

第二种:

写法如下

@Override
    public int compareTo(Student student) {
        // TODO Auto-generated method stub
        int resultAge = this.age - student.age;
        if(resultAge!=0){
            return resultAge;
        }
        float resultHeight = this.height - student.height;
        if(resultHeight != 0){
            return Float.floatToIntBits(resultHeight);
        }
        return this.name.compareTo(student.name);
    }

第二种写法:*如果int型参数的阈值(int resultAge = this.age – student.age)小于或等于Integer.MaxVale时,
结果值:restultAge 将会溢出,并返回一个负值*.


第三种:

如果当前类某个作用域的参数类型为引用类型
1:此引用类型可以考虑实现Comparable接口 ;
2:亦可构造一个Comparator 比较器.


如下:

package com.sta;

import java.util.Comparator;
import java.util.Date;

public class Student implements Comparable<Student> {
    private int age;
    private float height;
    private String name;
    private Info info;
    ......
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + Float.floatToIntBits(height);
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((info == null) ? 0 : info.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        if (obj == this) {
            return true;
        }
        if (obj != null && obj instanceof Student) {
            Student student = (Student) obj;
            return student.age == this.age && Float.floatToIntBits(student.height) == Float.floatToIntBits(this.height)
                    && (this.name == null ? student.name == null : this.name.equals(student.name))
                    && (this.info == null ? student.info == null : this.info.equals(student.info));
        }
        return false;
    }

    @Override
    public int compareTo(Student student) {
        // TODO Auto-generated method stub
        if (this.age > student.age) {
            return 1;
        }
        if (this.age < student.age) {
            return -1;
        }
        if (this.height > student.height) {
            return 1;
        }
        if (this.height < student.height) {
            return -1;
        }
        Comparator<Info> comparator = new Comparator<Info>() {

            @Override
            public int compare(Info o1, Info o2) {
                // TODO Auto-generated method stub
                Date date1 = o1.getBirthday();
                Date date2 = o2.getBirthday();
                int i = date1.compareTo(date2);
                if (i != 0) {
                    return i;
                }
                String address1 = o1.getAddress();
                String address2 = o2.getAddress();
                return address1.compareTo(address2);
            }
        };
        **int resultInfo = comparator.compare(this.info, student.info);**
        if (resultInfo != 0) {
            return resultInfo;
        }
        return this.name.compareTo(student.name);
    }
}

Student 作用域之一(Info):

package com.sta;

import java.util.Date;

public class Info { 
   
    private Date birthday;
    private String address;

    public Info() {
        super();
    }
.............


}

最后说两句:

1:比较基本数据类型时,可以使用”<”,”>”
2:亦可使用(Boxed primitive Type)基本类型封装类的compare方法
3:待补充…..

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158651.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • javascript中三目运算符的使用

    javascript中三目运算符的使用练习题:在一个文本框中输入0或者1,用三元运算符来判断,如果是0输出男,1表示输出女.&lt;!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;&lt;htmlxmlns="http://…

  • Excel宏教程 (宏的介绍与基本使用)

    Excel宏教程 (宏的介绍与基本使用)Excel宏教程(宏的介绍与基本使用)Microsoftexcel是一款功能非常强大的电子表格软件。它可以轻松地完成数据的各类数学运算,并用各种二维或三维图形形象地表示出来,从而大大简化了数据的处理工作。但若仅利用excel的常用功能来处理较复杂的数据,可能仍需进行大量的人工操作。但excel的强大远远超过人们的想象–宏的引入使其具有了无限的扩展性,因而可以很好地解决复杂

  • 微信小程序累计访客数怎么查_小程序独立访客uv是什么

    微信小程序累计访客数怎么查_小程序独立访客uv是什么在小程序后台查看打开这里然后在这里查看,不过是昨天的数据当天的在下一天更新也可以登录后台顶部导航栏右侧将鼠标挺方在手机查看数据上方扫二维码即可查看还有都告诉了这么多了扫一扫下方小程序码支持一下,谢谢…

  • navicat永久激活码最新[最新免费获取]

    (navicat永久激活码最新)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.htmlS32PGH0SQB-eyJsaWNlbnNlSW…

  • Matlab 直方图_matlab分析

    Matlab 直方图_matlab分析绘制直方图(水平和垂直的)语法bar(Y)bar(x,Y)bar(…,width)bar(…,’style’)bar(…,’bar_color’)bar(axes_handle,…)h=bar(…)hpatches=bar(‘v6’,…)barh(…)h=barh(…)hpatches=barh(‘v6

    2022年10月18日
  • Java学习之动态代理篇

    Java学习之动态代理篇0x00前言在后面的漏洞研究的学习中,必须要会的几个知识点。反射机制和动态代理机制。至于反射的前面已经讲到过了,这里就不做更多的赘述了。0x01动态代理这里先来讲一

    2021年12月12日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号