zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    hdu4347 The Closest M Points(kdtree+stl)
    bzoj1941 [Sdoi2010]Hide and Seek
    bzoj1941 [Sdoi2010]Hide and Seek
    bzoj2648 SJY摆棋子(不带修改的KDtree的学习)
    bzoj2648 SJY摆棋子(不带修改的KDtree的学习)
    bzoj2588 Spoj 10628. Count on a tree
    hdu2665 Kth number(主席树模板)
    hdu2665 Kth number(主席树模板)
    luoguP3168 [CQOI2015]任务查询系统
    12.模板别名以及auto定义返回值
  • 原文地址:https://www.cnblogs.com/cckong/p/13948199.html
Copyright © 2011-2022 走看看