【问题标题】:Lexicographic sorting in Java creating a strange orderJava中的字典排序创建一个奇怪的顺序
【发布时间】:2018-02-03 21:38:30
【问题描述】:

我正在尝试按数组内部的名称对对象数组进行排序。

grades[].name

我正在使用带有字典排序的插入方法,使用 compareTo 并且它有点工作,所以我知道我正确使用了 compareTo,但并非所有名称都被正确移动,我不确定这是否是我对词典的工作方式,或者我的循环是否导致问题。我知道字典会单独比较每个字母以确定位置。我最初认为它只是给字符串一个数值,并且正在寻找一种方法来找到它,但我认为情况并非如此。我已经查看了有关这种排序如何工作的其他问题,但它似乎并没有对我的问题有任何启发。我想知道我的问题是否是循环,我对排序方法的理解或其他导致此输出问题的原因。

我有 3 节课。调用 .insert 方法的对象是对包含我的实际数组的类的引用,因此该数组可以保持私有。

   `GradeArray gradeArr = new GradeArray();

    gradeArr.insert("Evans", 78, courseID);
    gradeArr.insert("Smith", 77, courseID);
    gradeArr.insert("Yee", 83, courseID);
    gradeArr.insert("Adams", 63, courseID);
    gradeArr.insert("Hashimoto", 91, courseID);
    gradeArr.insert("Stimson", 89, courseID);
    gradeArr.insert("Velasquez", 72, courseID);
    gradeArr.insert("Lamarque", 74, courseID);
    gradeArr.insert("Vang", 52, courseID);
    gradeArr.insert("Creswell", 88, courseID);`

这是在数组中创建条目。

这是我的排序循环。

`  public String reportgrades() //this is grade sorted by name 
    {
        String output = "Sorted by name ";
        int in, out;
        StudentGrade temp; //this is to hold the orginal variable. 
        //for the first letter cycle
        for (out = 1; out < nElems; out++) {
            temp = grades[out];
            in = out;
            while (in > 0 && 0 < (grades[in - 1].name.compareTo(grades[in].name))) {
                grades[in] = grades[in - 1];
                in--;
            }
            grades[in] = temp;
        }
        for (int j = 0; j < nElems; j++) {
            output += grades[j].name + ", ";
        }
        return output;
    }`

创建的输出是Sorted by name Evans, Smith, Adams, Hashimoto, Stimson, Velasquez, Lamarque, Vang, Creswell, Yee,

我很困惑为什么埃文斯和史密斯在亚当斯之前。我试图查看文档以了解 compareTo 的工作方式,但我似乎没有看到任何可以为我提供任何信息的信息。

【问题讨论】:

  • 这是一种家庭作业,主要挑战是编写自己的排序算法吗?或者你为什么不使用内置排序?
  • 也许 SO 有上进心,想写一个排序。它可能会发生。
  • 说真的,这是 SO 和他/她的调试器的工作。逐步完成。
  • 当你找到一个“更大”的名字时,while 循环就会被中断,“Adams”会被更改为“Yee”。它总是 'greater'。所以while循环在到达/移动“Yee”后总是会被打断。

标签: java sorting insertion-sort lexicographic


【解决方案1】:

当您移动值时,算法存在问题。 你需要把成绩[in-1] = temp;在您的 while 语句中,以便轮班工作。 我没有使用 GradeStudent 只是一个字符串,但你可以适应。 Grades 数组只是一个示例。

public static String reportgrades() //this is grade sorted by name 
    {

    String[] grades = {"Evans", "Smith", "Adams", "Hashimoto", 
    "Stimson", "Velasquez", "Lamarque", "Vang", "Creswell", "Yee"};
    String output = "Sorted by name ";
    int in, out;
    String temp; //this is to hold the orginal variable. 
    //for the first letter cycle
    long nElems = grades.length; 
    for (out = 1; out < nElems; out++) {
        in = out;
        while (in > 0 &&  0 < (grades[in - 1].compareTo(grades[in]))) {
            temp = grades[in];
            grades[in] = grades[in-1];
            grades[in-1] = temp;
            in--;
        }    
    }
    for (int j = 0; j < nElems; j++) {
         output += grades[j] + ", ";
    }
    return output;
}

【讨论】:

  • 请注意,如果您需要在订购时将“Adam”和“adam”视为相同,则需要添加大写或小写。
【解决方案2】:

您对 compareTo 的使用很好,但您没有比较正确的元素以进行插入排序。您需要将位于 out 的元素与每个较早的元素进行比较。但是在循环的第一步之后,您只是将之前out 中的元素相互比较。

您可以更改 while 循环以与 temp 进行比较:

while (in > 0 && 0 < (grades[in - 1].name.compareTo(temp.name))) {

或者保持那个while,但是改变循环来交换数组中的元素,而不是仅仅将它们向右移动:

    for (out = 1; out < nElems; out++) {
        in = out;
        while (in > 0 && 0 < (grades[in - 1].name.compareTo(grades[in].name))) {
            // swap grades at in-1 and in
            StudentGrade temp = grades[in];
            grades[in] = grades[in - 1];
            grades[in - 1] = temp;
            in--;
        }
    }

【讨论】:

    【解决方案3】:

    首先,将所有名称添加到列表中,然后排序:

    Collections.sort(list);      
    

    【讨论】:

      【解决方案4】:

      我跟随 vladwoguer 回答并将 grades[in-1] = temp; 移到我的 while 循环中。我没有意识到我实际上并没有移动我想要的变量。在我重新插入原始名称之前,我认为一切都必须移动。

      【讨论】:

        猜你喜欢
        • 2021-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多