2017-03-05 40 views
-3

以例如這些代碼片段:使用Comparable接口比較兩個對象時,this.method變量與object.method有什麼不同?

public int compareTo(DSA_Student C){ 
    if (this.getName().compareTo(C.getName())<0) return -1; 
    else 
     if (this.getName().compareTo(C.getName())>0) return 1; 
     else return (new Integer(this.getStudentId()).compareTo(new Integer(C.getStudentId()))); 
} 

在主類:

SortedSet <DSA_Student> S1=new TreeSet<DSA_Student>(); 
    DSA_Student a=new DSA_Student("A",10); 
    DSA_Student b=new DSA_Student("F",40); 
    DSA_Student c=new DSA_Student("B",49); 
    DSA_Student d=new DSA_Student("E",45); 
    DSA_Student e=new DSA_Student("D",30); 
    DSA_Student f=new DSA_Student("C",45); 
    DSA_Student g=new DSA_Student("B",45); 

    S1.add(a); 
    S1.add(b); 
    S1.add(c); 
    S1.add(d); 
    S1.add(e); 
    S1.add(f); 
    S1.add(g); 

我想知道什麼this.getName()和C.getName()指的是和怎麼做編譯器知道它們是兩個不同的對象,從而進行比較?

+0

編譯器**不知道它們引用了兩個不同的對象,只是它們引用'this'對象以及C(嚴重命名)參數引用的任何對象。它們實際上可以是同一個對象,或者C實際上可以是空引用。 –

+0

'this'是調用'compareTo'的實例; 'C'是它傳遞的參數。例如在'a.compareTo(b)''這個''是'a','C'是'b'。 –

+0

注意:'compareTo'根本不會被調用,因爲你傳入了一個'Comparator',除非'Comparator'碰巧調用'compareTo'。 –

回答

2

this.getName()裝置獲取其自己的對象的名稱

C.getName()意味着獲得對象的名稱C用於本身比較其他對象

compareTo方法傳遞

Comparable接口提供方法聲明於比較它自己的對象在其compareTo方法中傳遞的其他對象。

更新:

正如您所問,在使用可比compareTo方法的工作機制TreeSet,最好尋找到的TreeMapTreeSet源代碼添加對象時內部使用TreeMap put方法。由於TreeSet按排序順序保存其元素,因此只要在TreeSet中添加了元素,它就會進行排序。您可以有source code of TreeMap put method here。我取出只相關實施put方法中的哪一個,使用ComparablecompareTo方法有關:

  if (key == null) 
       throw new NullPointerException(); 
      // This is where it takes your custom comparable object 
      Comparable<? super K> k = (Comparable<? super K>) key; // 
      do { 
       parent = t; 
       // k as current object compareTo other object as 
       // t has been taken as root which changes 
       //its position based on comparsion 
       cmp = k.compareTo(t.key); 
       if (cmp < 0) 
        t = t.left; 
       else if (cmp > 0) 
        t = t.right; 
       else 
        return t.setValue(value); 
      } while (t != null); 

由於我不是Java專家,我會很樂意看到我更新任何評論,以確保信息是正確的。

+0

中編輯了那部分代碼,但是不要將'this.getName()'和'C.getName()'指向要添加到TreeSet的對象?編譯器如何知道:'DSA_Student a = new DSA_Student(「A」,10);'或 'DSA_Student b = new DSA_Student(「F」,40);''this.getName()'或'C.的getName()'? – Tia

+0

@Diksha:我已更新我的帖子以回覆您的評論。 –

相關問題