javaSE Comparable接口中的compareTo()方法


我們都知道,要對自建對象按照一定規則進行排序的話,要求自建對象實現Comparable接口,並重寫compareTo() 方法,但compareTo() 方法的釋義卻不是那么容易搞清楚,下面舉例進行闡述:

聲明一個Student類(成員變量id,name)實現Comparable接口,然后重寫compareTo()方法,

public class Student implements Comparable<Student>{    
    private int id;    
    private String name;
    
    @Override
    public int compareTo(Student o) {
        if(this.id < o.id)
            return -1;
        else if(this.id > o.id)
            return 1;
        else
            return 0;
    }
    
	//getter setter ...
    
    //toString ...
   
}

然后新建測試用例,

public static void main(String[] args) {
    List<Student> studentList = new ArrayList<>();
    Student s1 = new Student(10,"s1");
    Student s2 = new Student(20,"s2");
    Student s3 = new Student(30,"s3");
    studentList.add(s1);
    studentList.add(s2);
    studentList.add(s3);    
    Collections.sort(studentList);    
    System.out.println(studentList);
}

運行得到結果:

[Student:{id=10, name=s1}, Student:{id=20, name=s2}, Student:{id=30, name=s3}]

可以看出,集合中存的student對象經過 Collections.sort(studentList)方法后,進行了排序,此時很容易理解,因為重寫的方法compareTo方法中,定義了this.id < o.id return -1;,即當前對象的id小於傳入的對象id時,值就為-1,也就是說符合從小到達的順序邏輯,打印輸出的結果也就類似於升序的方式進行輸出打印,

此時從語義上理解id值的大小,也即為id=10 < id=20 < id=30;

但如做以下改動(eg-->2):

	@Override
    public int compareTo(Student o) {
        if(this.id < o.id)
            return 1;
        else if(this.id > o.id)
            return -1;
        else
            return 0;
    }

即當前對象的id小於傳入的對象id時,值卻為正整數1,這里就讓人很不好理解了,我們先不管,先看此時的打印輸出:

[Student:{id=30, name=s3}, Student:{id=20, name=s2}, Student:{id=10, name=s1}]

從數值上看,是降序排列,但這里我們其實要理解為是升序,只不過是數值大小的語意改變了,變成了id=30 < id=20 < id=10 的順序,10反而要看做是最大值。

如果按照這種思維去理解eg-->2這種情況,就很好理解compareTo()方法,其實最后的排序都可看做是升序排列,不過經過compareTo()方法后,我們定義了id的值得大小有所改變,eg-->2中,我們其實定義了id的值的大小是10> 20 > 30 , 其實也就是最終的排序還是數值小(30)的那個優先級最高,數值大(10)的放到了最后;

最初遇到這個問題是在慕課網學習數據結構--優先隊列這個概念時遇到的,想了好半天想不通,最后請教了相關老師,最終得以解惑~http://coding.imooc.com/learn/questiondetail/135180.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM