第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Java Collections.sort() 未按預(yù)期排序

Java Collections.sort() 未按預(yù)期排序

滄海一幻覺(jué) 2021-10-20 16:04:29
我正在嘗試按特定屬性(“程序”的“學(xué)生”對(duì)象和“教師”的“教授”對(duì)象)對(duì)兩個(gè)不同的對(duì)象數(shù)組列表進(jìn)行排序。這兩個(gè)類(lèi)都擴(kuò)展了我的抽象“人”類(lèi)。public abstract class Person implements Comparable<Person>{    private String name;    private String adress;    //getters, setters, etc., all works properly    @Override    protected Object clone() throws CloneNotSupportedException {        return super.clone();     }    public int compareTo(String string) {        return name.compareTo(string);    }}然后,當(dāng)我創(chuàng)建一個(gè)由 1000000 個(gè)隨機(jī)“人”對(duì)象組成的數(shù)組時(shí),可以是學(xué)生或教授,我決定像這樣按他們的名字按字母順序排序(這可以正常工作)。Person personByName[] = arrayPersonas.clone();Arrays.sort(personByName);然后,我將原始 Person 數(shù)組劃分為兩個(gè) ArrayList,一個(gè)用于 Student 對(duì)象,另一個(gè)用于教授對(duì)象:    ArrayList<Student> studentsByProgram = new ArrayList();    ArrayList<Professor> professorsByFaculty = new ArrayList();    for (int i = 0; i < 1000000; i++) {         if (arrayPersonas[i] instanceof Student) {            studentsByProgram.add((Student)arrayPersonas[i]);        } else {            professorsByFaculty.add((Professor)arrayPersonas[i]);        }    }當(dāng)我嘗試按我想要的屬性按字母順序?qū)γ總€(gè) ArrayList 進(jìn)行排序時(shí),問(wèn)題就出現(xiàn)了,因?yàn)樗恢卑?Person 的名稱(chēng)對(duì)它們進(jìn)行排序:Collections.sort(studentsByProgram);Collections.sort(professorsByFaculty);在這里,我離開(kāi)我的學(xué)生和教授課程:public class Student extends Person {    private String program;    private int year;    private double fee;    //constructor, setters, getters, toString, equals    @Override    protected Object clone() throws CloneNotSupportedException {        return super.clone();     }    public int compareTo(String string) {        return program.compareTo(string);     }    @Override    public int compareTo(Person t) {        return super.compareTo(t.getName());    }}教授班:public class Professor extends Person {    private String faculty;    private double salary;    //constructor, setters, getters, toString, equals    @Override    protected Object clone() throws CloneNotSupportedException {        return super.clone();     }    public int compareTo(String string) {        return faculty.compareTo(string);     }
查看完整描述

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() 的排序方法的排序方法。


查看完整回答
反對(duì) 回復(fù) 2021-10-20
?
慕田峪9158850

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊

問(wèn)題

  1. 您沒(méi)有定義Person應(yīng)該如何比較對(duì)象。

  2. 您錯(cuò)誤地定義了如何比較StudentProfessor實(shí)例。

  3. 您編寫(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ú)的方法是不值得的。


查看完整回答
反對(duì) 回復(fù) 2021-10-20
?
POPMUISE

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)方法給出的遺囑的“自然”排序。

  • Student[](或ArrayList<Student>)的“自然”排序?qū)⒂稍?code>compareTo(Student)方法給出。

  • 等等。

  • 在這些情況下都compareTo(String)不會(huì)使用您的方法!


查看完整回答
反對(duì) 回復(fù) 2021-10-20
  • 3 回答
  • 0 關(guān)注
  • 226 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)