Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中使用选择排序按字符串排序用户定义的数组_Java_Arrays_Sorting_Selection Sort - Fatal编程技术网

在java中使用选择排序按字符串排序用户定义的数组

在java中使用选择排序按字符串排序用户定义的数组,java,arrays,sorting,selection-sort,Java,Arrays,Sorting,Selection Sort,我正在做作业,我需要进行二进制搜索。但不知何故,我认为我在选择方面有问题。这里有一个名为Record的用户定义类。它具有以下属性: class Record{ String studentId; int assignment; int exam; int total; String grade; } 我有这些属性的getter。现在有另一个叫做成绩册的类,其中有一个类型记录数组。我通过名为loadFromTables的方法手动加载记录数组,如下所示: privat

我正在做作业,我需要进行二进制搜索。但不知何故,我认为我在选择方面有问题。这里有一个名为Record的用户定义类。它具有以下属性:

class Record{
   String studentId;
   int assignment;
   int exam;
   int total;
   String grade;
}
我有这些属性的getter。现在有另一个叫做成绩册的类,其中有一个类型记录数组。我通过名为loadFromTables的方法手动加载记录数组,如下所示:

private void loadFromTables(){

    String[] students = {
        "S10","S20","S30","S40","S50", "S60", 
        "S08","S18","S28","S38","S48", "S58",
        "S06","S16","S26","S36","S46", "S56",
    };

    int[] assignment = {
        0, 10, 20, 30, 30, 40, 
        0, 10, 20, 30, 30, 40, 
        0, 10, 20, 30, 30, 40,
    };

    int[] exam = {
        0, 39, 44, 44, 54, 59, 
        1, 40, 45, 45, 55, 60, 
        2, 41, 46, 46, 56, 58, 
    };

    nrecords = students.length;
    gradeBook = new Record[nrecords];

    for (int i = 0; i < nrecords; i++ ) {

        int t = assignment[i] + exam[i];
        String g = calculateGrade(t);
        Record r = new Record( students[i], assignment[i], exam[i], t, g );
        gradeBook[i] = r;

    }


}
现在我想通过属性studentId进行二进制搜索以查找记录。但首先我必须对记录数组进行排序。我被告知使用选择排序。所以,我这样做了,我认为这就是问题所在,但我似乎不知道在哪里

private void sortById(){

    //Selection Sort

    for(int i=0; i<nrecords-1; i++){

        int index = i;

        for(int j=i+1; j<nrecords; j++){

            if((gradeBook[index].studentId).compareTo(gradeBook[j].studentId) > 0){

                index = j;

            }

            Record temp =  gradeBook[i];
            gradeBook[i] = gradeBook[index];
            gradeBook[index] = temp;

        }

    }

}
这是我使用的二进制搜索代码,尽管我认为二进制搜索已经正确实现。因为我试着用冒泡排序法,那正是我想要的

public Record find(String id){

    //Binary Search

    int low = 0;
    int high = nrecords - 1;
    Record record = null;

    while(low <= high){

        int mid = (high + low)/2;

        if(id.compareTo(gradeBook[mid].studentId) == 0){

            record = new Record(id, gradeBook[mid].assignment, gradeBook[mid].exam, gradeBook[mid].total, gradeBook[mid].grade);
            return record;

        }
        else if(id.compareTo(gradeBook[mid].studentId) > 0){

            low = mid + 1;

        }
        else if(id.compareTo(gradeBook[mid].studentId) < 0){

            high = mid - 1;

        }

    }

    return record;

}

提前谢谢。我知道问题出在选择上,这让我头疼。感谢您的建议!:

在选择排序中,我们首先遍历子数组并在子数组中找到最小元素,然后在每次迭代中交换当前元素和最小元素

代码中的问题就在这里

for(int j=i+1; j<nrecords; j++){

    if((gradeBook[index].studentId).compareTo(gradeBook[j].studentId) > 0){
            index = j;
    }

    Record temp =  gradeBook[i];
    gradeBook[i] = gradeBook[index];
    gradeBook[index] = temp;

}

您更正的代码包含与我编写的完全相同的内容,但解释非常好。谢谢,把它标记为答案!它确实解决了我的问题!
private void sortById(){

    //Selection Sort

    for(int i=0; i<nrecords-1; i++){

        int index = i;

        for(int j=i+1; j<nrecords; j++){

            if((gradeBook[index].studentId).compareTo(gradeBook[j].studentId) > 0){

                index = j;

            }

            Record temp =  gradeBook[i];
            gradeBook[i] = gradeBook[index];
            gradeBook[index] = temp;

        }

    }

}