2017-05-14 20 views
0

私は割り当て作業中で、バイナリ検索を実行する必要があります。しかし、どういうわけか、自分の選択に問題があると思います。ここで私はレコードと呼ばれるユーザー定義のクラスがあります。それは次のプロパティを持っています:Javaで選択ソートを使用してユーザー定義の配列を文字列でソート

class Record{ 
    String studentId; 
    int assignment; 
    int exam; 
    int total; 
    String grade; 
} 

私はこれらのプロパティのゲッターを持っています。 グレードブックという名前の別のクラスがあり、その中にタイプのレコードの配列があります。次のように私は手動で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; 

} 

ありがとうございます。私は問題が選択ソートにあり、それが私の頭を食べていることを知っています。あなたの提案を感謝します! :)

答えて

1

選択ソートでは、最初にサブアレイを繰り返し、サブアレイ内の最小要素を見つけてから、最後に各繰り返しで現在と最小の要素Swapを見つけます。

コード内の問題はこちらです。

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; 

} 

あなたは最小要素を正しく見つけましたが、現在の文字列よりも小さい辞書の文字列が見つかった場合、繰り返しのスワップを行っています。したがって、このループでは、最小の要素を見つける必要があり、swap操作はこのループの実行後に実行する必要があります。

修正されたコード:

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; 

     } 

    } 

} 
+0

あなたの修正されたコードは、私が書いたとまったく同じものが含まれていますが、説明は素晴らしかったです。回答ありがとうございました!それが私の問題を解決しました! – Arefin

関連する問題