Java的重写comparTo方法与构造Comparator比较器
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<test>{ 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<test>{ 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<test> { 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<test>{ 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