【Java】java中的compareTo和compare的区别 compare 再看compareTo方法

【Java】java中的compareTo和compare的区别
compare
再看compareTo方法

【Java】java中的compareTo和compare的区别
compare
再看compareTo方法

从这里可以看出,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方法

【Java】java中的compareTo和compare的区别
compare
再看compareTo方法

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

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

【Java】java中的compareTo和compare的区别
compare
再看compareTo方法

来看具体方法的实现:

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);
        }
    }
}

结果

【Java】java中的compareTo和compare的区别
compare
再看compareTo方法

但是在设计类的时候,往往没有考虑到让类实现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);
        }
    }

}

结果跟上面的一样。