0

コードをステップ実行すると、内側の if ステートメントが完全にスキップされます。 updateGrade には入りません。if を完全にスキップするだけです。なぜ?

問題の方法は次のとおりです。

public void updateCourse(String courseID, String newLetterGrade){

    for(int i=0; i<classesTaken.size(); i++){

        if(classesTaken.contains(courseID)){
        classesTaken.get(i).updateGrade(newLetterGrade);
        }
    }
}

私のデバッガーによると、i = 5 で arrayList = 6 の場合、6 に達すると、理由もなくすぐにループから抜け出します。メイク時または実行時にエラーが表示されないため、何が問題なのかわかりません。

これは、classesTaken で courseID の内容が見つかったときに呼び出されるメソッドです。

public void updateGrade(String newGrade){
    letterGrade=newGrade;
    compute(newGrade);

私のテストファイルは次のようになります。

public class TranscriptTester {

public static void main(String[] args){
    Transcript test = new Transcript("11234", "Cody");
    test.addCourse("COP2013","A+");
    test.addCourse("COP2014","B+");
    test.addCourse("COP2015","B+");
    test.addCourse("COP2016","D+");
    test.addCourse("COP2017","A");
    test.addCourse();
    test.updateCourse("COP2013", "B-");
    test.updateCourse("COP2014", "A+");
    test.getGPA();
    test.printArray();
    test.toString();
}
}

私のコードによれば、COP2013 は 0 インデックスにあるため、classesTaken の最初の反復で if ステートメントにジャンプする必要があります。

私を助けるためにさらに情報が必要な場合は、お尋ねください。ありがとう!

すべてが何であるかを確認したい場合は、ここにすべてのクラスファイルがあります。

public class Course {

//global variables
private String courseID;
private String letterGrade;
private Double numberGrade;

//CONSTRUCTORS
//param
public Course(String id, String letter){
courseID = id;
letterGrade=letter;
compute(letter);
}
//default
public Course(){
    courseID = "COP2053";
    numberGrade = 4.0;
    letterGrade = "A";
    compute(getLetterGrade());
}


//COMPUTING GRADES AND UPDATING
private void compute(String letter){


    if(letter == "A+"){numberGrade = 4.0;}
    else if(letter == "A"){numberGrade = 3.67;}
    else if(letter == "A-"){numberGrade = 3.33;}
    else if(letter == "B+"){numberGrade = 3.00;}
    else if(letter == "B"){numberGrade = 2.67;}
    else if(letter == "B-"){numberGrade = 2.33;}
    else if(letter == "C+"){numberGrade = 2.00;}
    else if(letter == "C"){numberGrade = 1.67;}
    else if(letter == "C-"){numberGrade = 1.33;}
    else if(letter == "D+"){numberGrade = 1.0;}
    else if(letter == "D"){numberGrade = .67;}
    else if(letter == "D-"){numberGrade = .33;}
    else if(letter == "F"){numberGrade = 0.0;}

}

public void updateGrade(String newGrade){
    letterGrade=newGrade;
    compute(newGrade);
}

@Override
public String toString(){
    return "\nCourse: "+getCourseID()+"\nLetter Grade: "+getLetterGrade()
          +"\nGPA in course: "+numberGrade;

}




//GETTERS
public String getCourseID(){
    return courseID;
}

public String getLetterGrade(){
    return letterGrade;
}

public Double getNumberGrade(){
    return numberGrade;
}



}

転写ファイル:

public class Transcript {

private ArrayList<Course> classesTaken = new ArrayList<Course>();

public Transcript(String studentID, String studentName){
     System.out.println("\nStudent ID: "+studentID+"\nStudent Name: "+studentName);
}

public void addCourse(String courseID, String letterGrade){
    Course myCourse = new Course(courseID,letterGrade);
    classesTaken.add(myCourse);
}

public void addCourse(){
    Course myCourse = new Course();
    classesTaken.add(myCourse);
}

public void updateCourse(String courseID, String newLetterGrade){

    for(int i= 0; i<classesTaken.size(); i++){

        if(classesTaken.get(i).equals(courseID)){
        classesTaken.get(i).updateGrade(newLetterGrade);
        }
    }
}

public void getGPA(){
    System.out.println("\nOverall GPA: "+calculateGPA());
}

private Double calculateGPA(){
    Double overallGPA = 0.0;
    for(int i=0; i<classesTaken.size(); i++){
    overallGPA = classesTaken.get(i).getNumberGrade()+overallGPA;
    }

    return overallGPA / classesTaken.size();
}

public void printArray(){
    for(int i=0; i<classesTaken.size(); i++){
    System.out.println("\n"+classesTaken.get(i));
    }
}



}
4

3 に答える 3

1

updateCourse メソッドでは、Course オブジェクト (classesTaken ArrayList の項目) を String オブジェクト (courseID) と比較しています。したがって、if 条件が満たされることはありません。

次のように Course クラスの equals メソッドをオーバーライドして、「contains」メソッドを使用してコースを比較できるようにします。

@Override
public boolean equals(Object other){
    if (other == null) return false;
    if (other == this) return true;
    if (!(other instanceof Course))return false;
    Course otherCourse = (Course)other;
    return this.courseID.equals(otherCourse.courseID);
}

次に、同じタイプのオブジェクトが比較されるように、Transcript クラスの updateCourse メソッドも更新する必要があります。

public void updateCourse(String courseID, String newLetterGrade){   
    Course c = new Course(courseID, newLetterGrade);    
    for(int i= 0; i<classesTaken.size(); i++){
        if(classesTaken.get(i).equals(c)){
            classesTaken.get(i).updateGrade(newLetterGrade);
        }
    }
}
于 2013-04-26T01:06:00.127 に答える
1

あなたのコードを見るだけで、メソッドを誤用していることがわかります( with を使用equalsしない限りStringcontains

classesTaken.get(i).updateGrade

明らかにタイプではupdateGradeないオブジェクト( ではなく、何らかのタイプの)を呼び出しています。StringString

Stringしかし、あなたはリストlist でを見つけようとしますclassesTaken:

classesTaken.contains(courseID)

明らかにString、このリストには 's はありません。そうしないと、コードはコンパイルされません (メソッドStringがないためupdateGrade) 。

文字列がカスタム クラスのオブジェクトのコレクションにあるかどうかを確認するには、オーバーライドequalsするか、他のメソッドを提供する必要があります。

次のようにする必要があります(クラスが であると仮定しますClassTaken):

for(int i=0; i<classesTaken.size(); i++){
    ClassTaken c = classesTaken.get(i);
    if(c.getCourseId().equals(courseID)){
        c.updateGrade(newLetterGrade);
    }
}
于 2013-04-25T22:17:04.827 に答える