如何按降序对对象数组进行正确排序并在java中搜索它们?

时间:2013-12-14 10:08:45

标签: java arrays algorithm sorting object

我是当地大学的二年级学生,目前正在参加计算机编程课程。我在编程课上做得很好,虽然我一般都会遇到问题。我们的教授给了我们一些不完整的算法,他希望我们完成另一个诊断测试。他事先告诉我们,我们必须不使用快捷方式,这意味着我不能使用比较器,我只能使用基本的排序算法,如气泡,插入,选择和合并排序,我只能使用二进制或线性搜索。

我收到了一份不完整的文件,旨在对学生及其分数进行排序。我一直想到的一个特殊问题是我需要创建的排序算法和搜索算法。我们的讲师给了我们一些测试材料,看看我们的算法是否有效。令人惊讶的是,我没有。我已经尝试了所有类型的排序算法,但由于某种原因,测试表明算法失败了。我该如何解决这种困境。

操作系统: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;
            }
        }
    }


}

这是搜索算法的代码。同样,假设的设计是能够使用字符串“name”搜索学生的姓名和姓氏。该算法的制作方式应使其忽略名称的格式,例如“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);
    }
}

1 个答案:

答案 0 :(得分:0)

关于排序,在原始版本中,代码不会比较students数组中的最后两个元素。

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

循环的上限应该是students.length - 1,所以最后一个值 i的{​​{1}}将为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的{​​{1}}将是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;
            }
        }
    }
}