2013-04-25 1 views
0

코드를 단계별로 실행할 때 내부 if 문을 완전히 건너 뜁니다. updateGrade를 입력하지 마십시오. if를 완전히 건너 뜁니다. 왜? 문제디버그 및 실행 중에 어떤 이유로 내부 if 문을 건너 뜁니다.

을 heres 방법 :

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)이 바로 아무 이유없이 루프에서 휴식을 통과 할 때 내 디버거에 따라. make에서 또는 실행할 때 오류가 표시되지 않으므로 잘못되었는지 잘 모르겠습니다.

은 courseID의 내용이 classesTaken에서 발견 될 때 호출되는 방법입니다 :

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(); 
} 
} 

을 if COP2013이 0 인덱스에 있기 때문에 클래스 추출의 첫 번째 문장에서 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)); 
    } 
} 



} 
+0

그것은 많은 도움이 될 것 "대본"과 "클래스 촬영"이 있습니다. –

+0

classTaken.contains()가해야 할 일에 대해서도 궁금합니다. 루프 내부에서 호출하고 있지만 인수로 "i"를 사용하지 않으므로 루프 외부에서 호출하지 않는 것이 좋습니다. 아니면 수업을 의미 했나요? Take (i). contains()? –

답변

1

그냥 contains 방법 (당신이 Stringequals를 사용하지 않는 한) 당신이 오용하고있는 것으로 확인 코드를 찾고 :

classesTaken.get(i).updateGrade 

당신은 개체에 updateGrade를 호출하고 (일부 유형을 String을하지 않음) , 분명히 String 유형이 아닙니다.

는하지만 당신은 목록 classesTaken 목록에서 String를 찾아보십시오 :

classesTaken.contains(courseID) 

은 분명히이 목록에 String 년대 없습니다.그렇지 않으면 코드도 ( StringupdateGrade 방법을하지 않았기 때문에)

당신은 equals를 오버라이드 (override) 컴파일 또는 문자열을 사용자 정의 클래스의 객체의 컬렉션에 있는지 알아 내기 위해 다른 방법을 제공하지 않을

당신 이런 일을해야한다 (클래스가 ClassTaken 가정하자) : 당신의 updateCourse 방법에

for(int i=0; i<classesTaken.size(); i++){ 
    ClassTaken c = classesTaken.get(i); 
    if(c.getCourseId().equals(courseID)){ 
     c.updateGrade(newLetterGrade); 
    } 
} 
+0

크게 도움이되었습니다 –

0

그것은 보인다 classesTaken 저장 과정이 아닌 문자열. 따라서 ID 자체는 절대 포함되지 않습니다.

의 행을 따라 뭔가가있는 것 같아서 getID이라고 가정합니다.

1

을, String 오브젝트 (courseID)와 코스 개체 (classesTaken의 ArrayList에서 항목)을 비교한다. 따라서 if 조건은 결코 만족되지 않습니다.

다음과 같이 "contains"메서드를 사용하여 코스를 비교할 수 있도록 Course 클래스의 equals 메서드를 재정의합니다.

@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); 
} 

그리고 당신이 동일한 유형의 확인 오브젝트를 만들기 위해 당신의 성적 클래스의 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); 
     } 
    } 
} 
+0

조심하세요; 당신은 문자열을 비교하기 위해 "=="을 사용할 수 없다. –

+0

감사합니다. @EdwardFalk – Ideen

+0

이것은 정확하게 내가하려는 것이 아니지만, 저에게 아이디어를 몇 가지 줄 것입니다, 감사합니다! –