2013-04-19 274 views
0

我想使用下面的compareTo方法對數組進行排序。我很難理解它究竟做了什麼。我也沒有得到Object arg指的是什麼。任何人都可以向我解釋這種方法到底是什麼以及它是如何工作的?下面的代碼是我一直努力着......compareTo方法:Object arg?

public int compareTo (Object arg) 
{ 
    if (salary > ((Employee)arg).salary) 
     return; 
    else if (salary == ((Employee)arg).salary) 
     return 0: 
    else 
     return -1; 
} 
+0

請在您的代碼之前添加一行以使其出現在代碼塊中:) –

+0

謝謝!對不起,我是 – Mike

+0

的新手,它看起來像是將Employee的對象工資(或其子類)與工資實例變量進行比較。 – Ivo

回答

1

首先,有一個錯誤 - 第一回應該是return 1

public int compareTo (Object arg) 
{ 
    if (salary > ((Employee)arg).salary) 
     return 1; 
    else if (salary == ((Employee)arg).salary) 
     return 0: 
    else 
     return -1; 
} 

現在,我們來看看代碼。

要注意的第一件事是,我們要編碼的合同 - 特別是Comparable接口,這就需要你有一個方法compareTo,它有一個參數,調用它arg,並返回一個int。如果this小於arg,則int必須爲負,如果this大於arg則爲正,如果this等於arg,則該值爲0。

考慮到這一點,我們開始編碼。我們允許員工類別與其他員工進行比較的唯一因素是 - 因此我們將對象arg轉換爲Employee。如果它不是一個,就會拋出異常。

然後,我們簡單地將我們的工資與其工資進行比較,並根據兩位員工的訂單情況返回1或0或-1。這允許員工進行自然排序並進行排序,以便在容器中以正確的順序出現。

0

首先,我要承擔起第一「迴歸」實際上應該返回1

它是什麼做的是返回一個排序。通過返回1,它表示對象'arg'應該在當前對象之後出現(即它應該具有更高的索引)。類似地,值-1表示它應該在BEFORE之前,而值爲0意味着它是相等的,並且排序並不重要(儘管不同的排序算法可能與這些元素有不同的表現,稱爲stable sorting的屬性)。

1

compareTo正在比較thisarg,所以arg是你所比較的。實際上,這段代碼似乎通過比較員工的薪水來比較。 假設說return;行,就是要return 1;,代碼可以寫成

public int compareTo (Object arg) 
{ 
    Integer thisSalary = this.salary; 
    Integer otherSalary = ((Employee) arg).salary; 
    return thisSalary.compareTo(otherSalary); 
} 
0

Object arg表示您的compareTo將接收任何對象,而不僅僅是Employee對象。如果你想比較兩個不同類的對象,這可能是有用的(想象一下你想比較一個類Person和一個類Dog,如果它們都具有相同的權重,則返回true)。

在這種特殊情況下,您將arg轉換爲Employee,這意味着您將把特定對象視爲Employee實例。

我建議在代碼之前添加一個「if(instanceof(Employee))」。這意味着你只能運行你的代碼,以防arg實際上是一個Employee。 (例如:if(instanceof(Dog))將阻止嘗試將Person轉換爲Dog)。這是有用的,因爲試圖轉換不兼容的類型會導致異常。

0

我還沒有得到什麼對象ARG是指

爲了對項目進行排序的數組,你必須要能夠抓住項目之一,並將其​​與另一個項目。許多這樣的比較需要進行以便對項目進行完全分類。 compareTo()是您在類中定義的數組中所有項都屬於的方法。 compareTo()方法允許排序例程獲取數組中的一個項目,並在該項目上調用compareTo()。 compareTo()函數的參數是數組中的另一項。 compareTo()方法的返回值告訴排序例程如何排序這兩個項目。