2013-09-21 116 views
0
String letterGrade = "F"; 
if (grade >= 90) { letterGrade = "A"; } 
if (grade >= 80) { letterGrade = "B"; } 
if (grade >= 70) { letterGrade = "C"; } 
if (grade >= 60) { letterGrade = "D"; } 

只是一個硬件問題,我無法弄清楚。這個「if」陳述有什麼問題?

+0

哪裏'grade'從何而來? – Rob

+1

你爲什麼覺得有什麼問題?你有編譯錯誤嗎?如果是這樣,那麼錯誤是什麼?它是否編譯,但給一個意想不到的答案?如果是的話,那麼你期望什麼,它真的做了什麼? – Jesper

+0

嘗試從最小到最大,從'60'開始。 – elclanrs

回答

10

你應該有一個if-else if梯:

if (grade >= 90) { letterGrade = "A"; } 
else if (grade >= 80) { letterGrade = "B"; } 
else if (grade >= 70) { letterGrade = "C"; } 
else if (grade >= 60) { letterGrade = "D"; } 

..否則,所有的if語句將被執行。


您應該避免像這樣的硬編碼值。考慮這種情況,稍後某個時候,等級系統會發生變化,並且您開始爲grade >= 50提供等級E。那麼更改代碼將是噩夢。

一個更好的辦法是使用enum。您可能會注意到這些範圍內的行爲。在某個範圍內潛水任何值10,會給你相同的數字。你可以用這個邏輯來創建等級的枚舉:

enum Grade { 
    A(9), B(8), C(7), D(6); 

    private final Grade[] GRADES = values(); 

    private final int grade; 
    private Grade(int grade) { this.grade = grade; } 

    public int getGrade() { return this.grade; }   

    public Grade valueOf(int grade) { 
     for (Grade grade: GRADES) { 
      if (grade.getGrade() == grade/10) 
       return grade; 
     } 
     return null; 
    } 
} 

然後,對於一個特定的等級值,您可以通過使用getValue(grade)方法得到的字母等級:

Grade letterGrade = Grade.valueOf(grade); 

現在,很容易當添加新的等級範圍時擴展枚舉。現在,如果範圍類似於 - [85, 100](對於A),則此枚舉不起作用。爲此,您可以將枚舉中的等級值設置爲下限,如85(對於A)。然後改變返回Grade>而不是==的邏輯。

可以有其他的方式來形成邏輯,但這取決於情況。但這種方法將更加可維護。

下面是引自Effective Java - Item 50

串是爲枚舉類型較差的替代品。如第30項所述, 枚舉使得枚舉類型常量比字符串好得多。

+0

Aaah,謝謝。非常感謝。 –

+1

@DarbyVance不客氣:)你可以通過點擊它旁邊的勾號來標記答案。 –

+0

對枚舉建議+1。 –

1

你的條件全部滿足,如果statements.Use if else

String letterGrade = "F"; 
     if (grade >= 90) { 
      letterGrade = "A"; 

     } 
     else if (grade >= 80) { 
      letterGrade = "B"; 
     } 
     else if (grade >= 70) { 
      letterGrade = "C"; 
     } 
     else if (grade >= 60) { 
      letterGrade = "D"; 
     }else { 
      letterGrade="none"; //remove else it. so grade "F" remain 
     } 
    }