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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于.Net开源框架

    基于.Net开源框架转 https://www.cnblogs.com/hgmyz/p/5313983.html自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,在工作和学习中也积累了一些开源的组件,就目前想到的先整理于此,如果再想到,就继续补充这篇日志,日积月累,就能形成一个自己的组件经验库。分布式缓存框架:MicrosoftV…

    2022年7月15日
    23
  • 关于c++数的进制的经验

    默认状态下,数据按十进制输入输出。如果要求按八进制或十六进制输入输出,在cin或cout中必须指明相应的数据形式,oct为八进制,hex为十六进制,dec为十进制。注意:1.使用不带.h的头文件时,必

    2021年12月20日
    47
  • 普通用户免输密码切换root「建议收藏」

    普通用户免输密码切换root

    2022年2月22日
    67
  • vmware15最新激活码2021【注册码】

    vmware15最新激活码2021【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    61
  • html中超链接使用_html中的a标签,超链接代码的详细介绍「建议收藏」

    html中超链接使用_html中的a标签,超链接代码的详细介绍「建议收藏」欢迎关注支持,谢谢!今天为大家介绍的是超链接代码a标签的用法,大家有兴趣的话可以看看哟!随着互联网的发展,网站的兴起,超链接随处可见。我们使用电脑或手机上网,能够穿梭在各个网页之间,都是通过超链接实现的。超链接就像通向另一个“世界”的桥梁,我们可以通过它到达另一个“世界”。接下来我们就来学习一下网页中的超链接到底是什么东西。连接一、什么是超链接超链接属于网页的一部分,它是让网页和网页连接的元素。…

    2022年7月13日
    17
  • html鼠标手状态,css鼠标样式cursor介绍(鼠标手型)

    html鼠标手状态,css鼠标样式cursor介绍(鼠标手型)CSS鼠标样式语法如下:任意标签中插入style=”cursor:*”例子:文本或其它页面元素文本或其它页面元素注意把*换成如下15个效果的一种:下面是对这15种效果的解释。移动鼠标到解释上面,看看你的鼠标起了什么变化吧!hand是手型例子:CSS鼠标手型效果CSS鼠标手型效果pointer也是手型,这里推荐使用这种,因为这可以在多种浏览器下使用。例子:CSS鼠标手型效果CS…

    2022年5月6日
    59

发表回复

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

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