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:待补充…..

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • git放弃修改&放弃增加文件

    git放弃修改&放弃增加文件

    2022年2月10日
    57
  • 冯诺依曼计算机特点核心(冯诺依曼计算机体系结构特点)

    冯·诺依曼计算机的特点1.计算机由运算器、存储器、控制器、输入输出设备5大部件组成2.指令和数据以同等地位存储于储存器内,并可按照地址寻访3.指令和数据均用二进制码表示4.指令由操作码和地址码组成5.指令在存储器之中按照顺序存放。通常,指令是顺序执行的,在特定条件下,可以根据运算结果或根据设定的条件改变执行顺序6.机器以运算器为中心,输入输出设备与存储器之间的数据存储必须通过运算器完成。…

    2022年4月18日
    102
  • DDD中的建模方法有哪些[通俗易懂]

    DDD中的建模方法有哪些[通俗易懂]一、背景在之前的文章中已经介绍了DDD相关的概念模式,DDD相关的业务技术架构,但是我们还没有找到一个核心的抓手去实践DDD。DDD的一个核心本质就是对业务建模,或者领域建模。说的很简单,但是做好确实很难,一个需求过来意淫几个实体对象就差不多解决了。深入看,全局看只在脑海中进行的建模实际上并不一定正确和稳定。因此我们需要找到正确的方法帮助对业务领域进行分析,得到建模结构,共享建模成果。二、四色建模法2.1起源&概念&要素关于四色建模的概念我们可与追溯到90年代,起源于四色原型。四色

    2025年12月1日
    6
  • python常用模块大全_python常用第三方模块大全

    python常用模块大全_python常用第三方模块大全mathmath.ceil(a):用来返回≥a的最小整数math.floor(a):用来返回≤a的最大整数round(a[,b])如果没有参数b,只有a,round()作用是四舍五入如果

    2022年7月28日
    7
  • mysql实战34讲_有效教学十讲读书心得

    mysql实战34讲_有效教学十讲读书心得此文为极客时间:MySQL实战45讲的4、5、9、10、11、15、18节索引相关部分的总结一、Innodb索引模型1.主键/非主键索引的区别每个索引在Innodb中都是一颗B+树,其中根据索

    2022年8月16日
    5
  • 阶乘相加

    阶乘相加阶乘相加

    2022年4月24日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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