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

左右棋牌ios版下載
2025年2月27日服务器合并投票和合服大比拼结果公告