3 回答

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超4個(gè)贊
您有兩個(gè)不同的 compareTo() 方法。Collections.sort() 不會(huì)調(diào)用您期望使用的那個(gè)。
如果您想使用 Collections.sort() 對(duì)學(xué)生進(jìn)行排序,那么您需要一個(gè)帶有簽名的方法 compareTo(Student student);
此方法與 compareTo(Person person) “重疊”,這是兩個(gè)方面的問(wèn)題:
從語(yǔ)義上講,Person 級(jí)別的 compareTo() 方法建立了語(yǔ)義,而 Student 級(jí)別的 compareTo() 方法偏離了這些語(yǔ)義,這絕不是一個(gè)好主意。
從技術(shù)上講,您依賴(lài)于與方法綁定相關(guān)的實(shí)現(xiàn)細(xì)節(jié)來(lái)使您的系統(tǒng)按預(yù)期運(yùn)行。這充其量是狡猾的。
我會(huì)尋找一種使用顯式用戶(hù)提供的比較器而不是依賴(lài)于內(nèi)部 compareTo() 的排序方法的排序方法。

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
問(wèn)題
您沒(méi)有定義
Person
應(yīng)該如何比較對(duì)象。您錯(cuò)誤地定義了如何比較
Student
和Professor
實(shí)例。您編寫(xiě)
compareTo(String)
了具有誤導(dǎo)性的重載方法。
解決方案
Person#compareTo正確定義,刪除其compareTo(String):
public int compareTo(Person p) {
return getName().compareTo(p.getName());
}
定義Student#compareTo并Professor#compareTo正確刪除它們的compareTo(String). 這是一個(gè)如何Student#compareTo編寫(xiě)的示例:
@Override
public int compareTo(Person t) {
final int personComparisonResult = super.compareTo(t);
if (personComparisonResult == 0) {
return program.compareTo(((Student) t).program);
}
return personComparisonResult;
}
它說(shuō)“首先將它們作為Persons進(jìn)行比較;如果它們相等(此處為同名),則將它們作為Students進(jìn)行比較(此處為學(xué)生的程序)”。
我會(huì)刪除這些方法。對(duì)于不適合類(lèi)域的簡(jiǎn)單代碼行使用單獨(dú)的方法是不值得的。

TA貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個(gè)贊
如果要使用與類(lèi)“自然”排序不同的排序?qū)?duì)象進(jìn)行排序,則應(yīng)該使用Arrays.sort(T[], Comparator<T>)
, 和一個(gè)Comparator
實(shí)現(xiàn)特定排序順序的對(duì)象。
該javadoc的用于Comparable
解釋說(shuō),它應(yīng)該實(shí)現(xiàn)的語(yǔ)義。(仔細(xì)閱讀它們?。?/p>
關(guān)于自然排序:
Person[]
由compareTo(Person)
方法給出的遺囑的“自然”排序。a
Student[]
(或ArrayList<Student>
)的“自然”排序?qū)⒂稍?code>compareTo(Student)方法給出。等等。
在這些情況下都
compareTo(String)
不會(huì)使用您的方法!
添加回答
舉報(bào)