簡體   English   中英

如何正確地對對象數組進行降序排序並在Java中搜索它們?

[英]How do I properly sort an array of objects in descending order and search for them in java?

我是當地大學的二年級學生,目前正在參加計算機編程課程。 盡管我通常會遇到問題,但我在編程課上的表現還是不錯的。 我們的教授給了我們一些不完整的算法,他希望我們完成它作為另一個診斷測試。 他事先告訴過我們,我們必須不使用快捷方式來做到這一點,這意味着我不能使用比較器,我只能使用基本的排序算法,例如冒泡,插入,選擇和合並排序,而我只能使用二進制或線性搜索。

系統給我提供了一個不完整的文件,旨在對學生及其分數進行排序。 我一直想提出的一個特殊問題是我需要創建的排序算法和搜索算法。 我們的講師為我們提供了一些測試材料,以查看我們的算法是否有效。 令人驚訝的是,我沒有。 我嘗試了所有類型的排序算法,但由於某種原因,測試表明該算法失敗。 我該如何解決這一困境。

操作系統:Windows 7,Java Workbench:Eclipse

這是該算法的代碼。 如果這看起來很亂,我深表歉意。 這是目前的分類算法。 假設的設計(由我的教授設計)是將數組按降序排序。

    public static void sort(Student[] students) {
    if(students == null)
        return;
    for(int i=0;i<students.length-2;i++){
        Student temp = students[i];
        for(int k=i+1;k<students.length-1;k++){
            Student temp2= students[k];
            int result = temp2.compareTo(temp);
            if(result > 0){
                students[k] = temp;
                students[i] = temp2;
            }
        }
    }


}

這是搜索算法的代碼。 再次,假定的設計是它將能夠使用字符串“名稱”來搜索學生的給定姓名和姓氏。 該算法的制作方式應使其忽略名稱的格式,例如“ lastname firstname”和“ firstname lastname”,並忽略大寫字母。 再次,為您的混亂工作表示歉意。

    public static int search(Student[] students, String name) {
    if(students == null || students.length == 0)
        return -1;
            for(int i=0;i<students.length;i++){
                name.toLowerCase();
                if(name.compareTo(students[i].getGivenName().toLowerCase()+" "+students[i].getFamilyName().toLowerCase()) == 0 || name.compareTo(students[i].getFamilyName().toLowerCase()+" "+students[i].getGivenName().toLowerCase()) == 0)
                    return 1;
    }
    return -1;
}

因此,總的來說,如果您跳到最后,我的問題是:我的排序算法有什么問題,有沒有一種更好,更簡單的方法來縮短搜索算法,同時仍能正常工作

編輯:這是分別用於排序和搜索算法的測試算法。 測試排序算法可以遵循我制定的排序算法,但是由於某種原因,它沒有通過教授制定的布爾條件。

    public void testSort() throws OutOfRangeException, FileNotFoundException {
    Student[] students = new Student[6];
    students[0] = new Student("joey", "mitchel", new int[]{42,51,64,70,81});
    students[1] = new Student("Sandy", "luchel", new int[]{64,51,64,70,81});
    students[2] = new Student("Sandy", "luchel", new int[]{42,51,64,70,81});
    students[3] = new Student("amanda", "jones", new int[]{95,51,64,70,81});
    students[4] = new Student("Susane", "Louis", new int[]{42,51,64,70,81});
    students[5] = new Student("Samuel", "jones", new int[]{95,51,64,70,81});


    StudentSearcherSorter.sort(students);
    for(int i=0; i<students.length - 1; i++) {
        boolean b1 = students[i].total() > students[i+1].total();
        boolean b2 = false;
        boolean b3 = false;
        if(b1 == false && students[i].total() == students[i+1].total())
            b2 = students[i].getFamilyName().compareTo(students[i+1].getFamilyName()) < 0;
        if(b2 == false && students[i].total() == students[i+1].total() && students[i].getFamilyName().compareTo(students[i+1].getFamilyName()) == 0)
            b3 = students[i].getGivenName().compareTo(students[i+1].getGivenName()) < 0;
        assertTrue(b1 || b2 || b3);
    }
}

以及搜索測試算法。 我不確定是哪里出了問題,盡管通常來說,這可能與我處理搜索算法代碼的方式有關。

    public void testSearch() throws FileNotFoundException, OutOfRangeException {
    Student[] students = new Student[6];
    students[0] = new Student("joey", "mitchel", new int[]{42,51,64,70,81});
    students[1] = new Student("Sandy", "luchel", new int[]{64,51,64,70,81});
    students[2] = new Student("Sandy", "luchel", new int[]{42,51,64,70,81});
    students[3] = new Student("amanda", "jones", new int[]{95,51,64,70,81});
    students[4] = new Student("Susane", "Louis", new int[]{42,51,64,70,81});
    students[5] = new Student("Samuel", "jones", new int[]{95,51,64,70,81});


    for(int i=0; i<students.length; i++) {
        assertTrue(StudentSearcherSorter.search(students, students[i].getGivenName().toUpperCase()+" "+students[i].getFamilyName()) >= 0);
        assertTrue(StudentSearcherSorter.search(students, students[i].getFamilyName()+" "+students[i].getGivenName().toUpperCase()) >= 0);
    }
}

關於排序,在原始版本中,代碼不比較students數組中的最后兩個元素。

public static void sort(Student[] students) {
    if(students == null)
        return;

循環的上限應為students.length - 1 ,因此i的最后一個值將為students.length - 2

    // for(int i=0;i<students.length-2;i++){
    for(int i=0;i<students.length-1;i++){
        Student temp = students[i];

同樣,此循環的上限應該是students.length ,因此k的最后一個值將是stidents.length - 1 另外,在兩種情況下,都可以將<替換為<=

        // for(int k=i+1;k<students.length-1;k++){
        for(int k=i+1;k<students.length;k++){
            Student temp2= students[k];
            int result = temp2.compareTo(temp);
            if(result > 0){
                students[k] = temp;
                students[i] = temp2;
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM