java compareto重写_Java 关于重写compareTo方法

本文介绍了Java中Comparable接口的用途,通过实现该接口可以进行自定义排序。详细讲解了compareTo方法的使用,包括升序和降序的判断,并提供了三种不同的compareTo方法重写示例,涉及多字段比较、溢出问题以及引用类型比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

"当一个类实现类Comparable接口,此类就可以跟很多泛型算法(generic algorithm) 以及依赖于该接口

的集合实现(Collection implementation)进行协作"

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

Comparable接口

public interface Comparable{

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 {

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

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 {

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 comparator = new Comparator() {

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值