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

原文地址:https://www.cnblogs.com/cckong/p/13948199.html