zoukankan      html  css  js  c++  java
  • 【Java】java中的compareTo和compare的区别

    compare

    从这里可以看出,compare是Comparator接口中的一个类,再看一下源代码中的解释

    Compares its two arguments for order. Returns a negative integer,
    zero, or a positive integer as the first argument is less than, equal
    to, or greater than the second

    如果第一个参数小于第二个参数,就返回一个负数,如果等于就返回0,如果大于就返回一个正数。

    再看compareTo方法

    首先,他是Comparable接口中的一个方法,

    然后String类继承了Comparable接口,并实现了comparteTo方法

    来看具体方法的实现:

    public int compareTo(String anotherString) {
            int len1 = value.length;
            int len2 = anotherString.value.length;
            int lim = Math.min(len1, len2);
            char v1[] = value;
            char v2[] = anotherString.value;
    
            int k = 0;
            while (k < lim) {
                char c1 = v1[k];
                char c2 = v2[k];
                if (c1 != c2) {
                    return c1 - c2;
                }
                k++;
            }
            return len1 - len2;
        }

    让需要进行排序的对象实现Comparable接口,重写其中的compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用java.util.Arrays.sort()来排序对象数组,实例如下:

    class Student implements Comparable<Student>{
        private String name;
        private int age;
        private float score;
        
        public Student(String name, int age, float score) {
            this.name = name;
            this.age = age;
            this.score = score;
        }
        
        public String toString()
        {
            return name+"		"+age+"		"+score;
        }
    
        @Override
        public int compareTo(Student o) {
            // TODO Auto-generated method stub
            if(this.score>o.score)//score是private的,为什么能够直接调用,这是因为在Student类内部
                return -1;//由高到低排序
            else if(this.score<o.score)
                return 1;
            else{
                if(this.age>o.age)
                    return 1;//由低到高排序
                else if(this.age<o.age)
                    return -1;
                else
                    return 0;
            }
        }
    }
    
    public class ComparableDemo01 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Student stu[]={new Student("zhangsan",20,90.0f),
                    new Student("lisi",22,90.0f),
                    new Student("wangwu",20,99.0f),
                    new Student("sunliu",22,100.0f)};
            java.util.Arrays.sort(stu);
            for(Student s:stu)
            {
                System.out.println(s);
            }
        }
    }

    结果

    但是在设计类的时候,往往没有考虑到让类实现Comparable接口,那么我们就需要用到另外的一个比较器接口Comparator。

    从上面的实例我们可以发现,compareTo(T o)只有一个参数,而Comparator接口中必须要实现的compare(T o1,T o2)就有两个参数。

    新建3个类

    Student.java

    package map;
    
    public class Student {
        private String name;
        private int age;
        private float score;
    
        public Student(String name, int age, float score) {
            this.name = name;
            this.age = age;
            this.score = score;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public float getScore() {
            return score;
        }
    
        public void setScore(float score) {
            this.score = score;
        }
    
        @Override
        public String toString() {
            return name + "		" + age + "		" + score;
        }
    
    }

    StudentComparator.java

    package map;
    
    import java.util.Comparator;
    
    public class StudentComparator implements Comparator<Student> {
    
        public int compare(Student o1, Student o2) {
            if (o1.getScore() > o2.getScore())
                return -1;
            else if (o1.getScore() < o2.getScore())
                return 1;
            else {
                if (o1.getAge() > o2.getAge())
                    return 1;
                else if (o1.getAge() < o2.getAge())
                    return -1;
                else
                    return 0;
            }
        }
    
    }

    测试类

    public class Test {
    
        public static void main(String[] args) {
            Student stu[] = { new Student("zhangsan", 20, 90.0f),
                    new Student("lisi", 22, 90.0f),
                    new Student("wangwu", 20, 99.0f),
                    new Student("sunliu", 22, 100.0f) };
            java.util.Arrays.sort(stu, new StudentComparator());
            for (Student s : stu) {
                System.out.println(s);
            }
        }
    
    }

    结果跟上面的一样。

  • 相关阅读:
    Oracle根据【日期】组,其他条件根据PIVOT行转列。使每个日期条件关联的其他数据只有一行。
    ORACLE数据库,数据量大,转移数据到备份表语句
    C#解析"a=1&b=2&c=3"字符串,微信支付返回字符串,替换<br>为&
    dataTable的数据,调试的时候点放大镜就看到了啊啊啊!
    Debug和Release 老程序啊 调试之前 区分一下啊
    FastReport.NET
    grpc 实现微服务生态笔记
    金木水火土
    shell 指令分析nginx 日志qps
    idea中使用tomcat 方式启动spring boot项目
  • 原文地址:https://www.cnblogs.com/six-moon/p/4691876.html
Copyright © 2011-2022 走看看