【问题标题】:How do I properly sort an array of objects in descending order and search for them in java?如何正确地按降序对对象数组进行排序并在 java 中搜索它们?
【发布时间】:2013-12-14 10:08:45
【问题描述】:

我是当地一所大学的二年级学生,目前正在学习计算机编程课程。我在我的编程课上做得很好,虽然我通常会遇到问题。我们的教授给了我们一些不完整的算法,他希望我们完成这些算法作为另一个诊断测试。他事先告诉我们,必须不使用捷径,也就是说我不能使用比较器,只能使用冒泡、插入、选择和归并排序等基本排序算法,只能使用二分或线性搜索。

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

操作系统:Windows 7, Java 工作台: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);
    }
}

【问题讨论】:

  • 对于您的搜索算法,Strings 是不可变的。即它应该是name = name.toLowerCase();
  • 如果我将其作为实际程序的一部分而不是作为练习,我会编写一个 Comparator 以忽略大小写以降序比较字符串。在 Arrays.sort 和 Arrays.binarySearch 中使用该比较器。
  • @PatriciaShanahan,这不会教学生任何关于排序和搜索的知识。

标签: java arrays algorithm sorting object


【解决方案1】:

关于排序,在原版中,代码没有比较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。或者,在这两种情况下,您都可以 将&lt; 替换为&lt;=

        // 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;
            }
        }
    }
}

【讨论】:

  • 感谢您的帮助。我已经使用了您建议的更改,但似乎再次未能通过测试。不过,以防万一,我已经编辑了我的问题,以便您可以看到程序正在测试什么。
  • @user3101890 显示 Student.compareTo 并检查与 testSort 中的比较相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2014-02-05
  • 2011-02-09
  • 2014-02-16
  • 2017-09-20
  • 1970-01-01
相关资源
最近更新 更多