-
Java的重写comparTo方法与构造Comparator比较器
2025-08-13 15:41:32
java中compareTo本来是比较字符串的方法(int类型使用运算符<>=比较)
返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方结束。
如果参数字符串等于此字符串,则返回值 0;
如果此字符串小于字符串参数,则返回一个小于 0 的值;
如果此字符串大于字符串参数,则返回一个大于 0 的值。
public class Test {
public static void main(String args[]) {
String str1 = "Strings";
String str2 = "Strings";
String str3 = "Strings123";
int result = str1.compareTo( str2 );
System.out.println(result);
result = str2.compareTo( str3 );
System.out.println(result);
result = str3.compareTo( str1 );
System.out.println(result);
}
}
要在类方法里重写compareTo方法 可以实现类数组的sort 必须要求类实现Comparable接口(所有继承collections的都实现了这个接口)1.重写compareTo方法
class test implements Comparable
{ private String title;
private double price;
public test(String title,double price){
this.title = title;
this.price = price;
}
@Override
public String toString() {
return "书名:"+this.title+",价格:"+this.price;
}
@Override
public int compareTo(test o) {
//升序
if(this.price > o.price){
return 1;
}else if(this.price < o.price){
return -1;
}else{
return 0;
}
}
使用两者之差作为返回值(类中变量price是double类型 需要返回时强行类型转换一下)
class test implements Comparable
{ private String title;
private double price;
public test(String title,double price){
this.title = title;
this.price = price;
}
@Override
public String toString() {
return "书名:"+this.title+",价格:"+this.price;
}
@Override
public int compareTo(test o) {
//升序
return (int)(this.price-o.price);
// 降序
// return (int)(o.price-this.price);
}
主函数测试一下sort函数
我使用的是降序的那个 输出成功 排序完成
2.构造新的比较器· 实现比较器Comparator 接口
比较器提供的两个抽象方法 compare以及equals
通过API,我们来解读接口方法:
Compare()比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。 在前面的描述中,符号 sgn(expression) 表示 signum 数学函数,根据 expression 的值为负数、0 还是正数,该函数分别返回 -1、0 或 1。
实现程序必须确保对于所有的 x 和 y 而言,都存在 sgn(compare(x, y)) == -sgn(compare(y, x))。(这意味着当且仅当 compare(y, x) 抛出异常时 compare(x, y) 才必须抛出异常。)
实现程序还必须确保关系是可传递的:((compare(x, y)>0) && (compare(y, z)>0)) 意味着 compare(x, z)>0。
最后,实现程序必须确保 compare(x, y)==0 意味着对于所有的 z 而言,都存在 sgn(compare(x, z))==sgn(compare(y, z))。
虽然这种情况很普遍,但并不 严格要求 (compare(x, y)==0) == (x.equals(y))。一般说来,任何违背这个条件的 Comparator 都应该清楚地指出这一事实。推荐的语言是“注意:此 Comparator 强行进行与 equals 不一致的排序。”
可能抛出异常ClassCastException - 如果参数的类型不允许此 Comparator 对它们进行比较。
Equals()指示某个其他对象是否“等于”此 Comparator。此方法必须遵守 Object.equals(Object) 的常规协定。此外,仅当 指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时,此方法才返回 true。因此,comp1.equals(comp2) 意味着对于每个对象引用 o1 和 o2 而言,都存在 sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))。
注意,不重写 Object.equals(Object) 方法总是安全的。然而,在某些情况下,重写此方法可以允许程序确定两个不同的 Comparator 是否强行实施了相同的排序,从而提高性能。
覆盖: 类 Object 中的 equals
参数: obj - 要进行比较的引用对象。
返回: 仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true。
Arrays.sort()的文档 (类型数组,比较器)
import java.util.*;
import java.util.Arrays;
class test
//implements Comparable
{
private String title;
private double price;
public test(String title, double price) {
this.title = title;
this.price = price;
}
@Override
public String toString() {
return "书名:" + this.title + ",价格:" + this.price;
}
public int getprice() {
return (int)price;
}
public static void main(String[] args) {
test[] arr=new test[4];
test book1=new test("1",100);
test book2=new test("2",50);
test book3=new test("3",120);
test book4=new test("4",300);
arr[0]=book1;arr[1]=book2;arr[2]=book3;arr[3]=book4;//
Arrays.sort(arr,new myComparator());
for(test tmp:arr)
{
System.out.println(tmp.toString());
}
return;
}
} //类外定义比较器
class myComparator implements Comparator
{ public int compare(test t1,test t2)
{
return (int)(t1.getprice()-t2.getprice());
}
}
参考博客:菜鸟教程
https://blog.csdn.net/liuwg1226/article/details/85268814
https://www.cnblogs.com/ldy-blogs/p/8488138.html