2015-11-09 15 views
0

正如標題所示。我需要在90-100分之間得分「A」的返回位置的功能。或者在這種情況下,無論用戶決定根據曲線還是其他東西設置截斷值。這就是我所擁有的,但我想不出一種辦法讓它達到我想要的效果。使用鍵映射到一系列值。信函等級考試成績示例

private HashMap<String, Double> letterGrade = new HashMap<String, Double>(); 

public void setgradeCutOff(String[] letterGrades, double[] cutoffs) { 
     for(int i = 0; i < letterGrades.length; i++){ 
      letterGrade.put(letterGrades[i], cutoffs[i]); 
     } 

    } 
public String getGrade(String studentName) { 
    //Returns a student's average score for all exams 
    double averageScore = getAverageExamGrade(studentName); 
    for(Entry<String, Double> entry : letterGrade.entrySet()){ 
     if(entry.getValue() == averageScore){ 
      return entry.getKey(); 
     } 
    } 
    return null; 
} 

這隻有在averageScore恰好是截斷值之一時纔有效。我如何修改它以便字符串鍵映射到setGradeCutOff方法指定的範圍?

這是我期望它的工作:

setLetterGradesCutoffs(new String[]{"A","B","C","D","F"}, 
        new double[] {85,70,60,50,0}); 

Laura. Average exam score: 87 Grade: A 
Peter. Average exam score: 72 Grade: B 
Miranda. Average exam score: 67 Grade: C 
+0

你的問題是完全不清楚。你需要一個更確切的問題陳述。 –

+0

什麼部分不清楚?如果需要,我可以對它進行編輯,但我認爲這是對它的充分描述。用戶指定截止點,並根據該等級確定等級。我將添加一個功能的例子。 –

+0

@SeanF在閱讀了幾次這樣的問題後,我仍然不明白這個想法。你想要平均分數還是什麼?當你的意思是切斷什麼?我可以用我以前在學校任務中​​所做的任何解釋來解釋這個問題,但這個問題並不清楚。 –

回答

3

無需第三方庫,TreeMap可以做到這一點,使用floorEntry()方法(爪哇6+):

private static TreeMap<Double, String> gradeMap = new TreeMap<>(); 
static { 
    gradeMap.put(85.0, "A"); 
    gradeMap.put(70.0, "B"); 
    gradeMap.put(60.0, "C"); 
    gradeMap.put(50.0, "D"); 
    gradeMap.put(0.0, "F"); 
} 
private static void printGrade(double score) { 
    System.out.printf("Average exam score: %s Grade: %s%n", 
         NumberFormat.getInstance().format(score), 
         gradeMap.floorEntry(score).getValue()); 
} 

測試

public static void main(String[] args) { 
    printGrade(87); 
    printGrade(72); 
    printGrade(67); 
    printGrade(69.99); 
    printGrade(70.00); 
    printGrade(70.01); 
} 

輸出

Average exam score: 87 Grade: A 
Average exam score: 72 Grade: B 
Average exam score: 67 Grade: C 
Average exam score: 69.99 Grade: C 
Average exam score: 70 Grade: B 
Average exam score: 70.01 Grade: B 
1

您可以使用番石榴的RangeMap牌號的範圍映射到一個字母:

RangeMap<Integer, String> gradeLetter = ImmutableRangeMap.builder() 
    .put(Range.closed(90, 100), "A") 
    .put(Range.closed(60, 89), "B") 
    // ... 
    .build(); 

public String getGrade(String studentName) { 
    int averageScore = getAverageExamGrade(studentName); 
    return gradeLetter.get(averageScore); 
} 
+0

這似乎是對我而言。我唯一擔心的是我可能不得不通過double [] cutoffs數組遍歷來確定截斷值。性能會受到影響,嵌套在那裏的循環會不會呢? –

+0

我認爲答案應該解釋爲什麼HashMap不起作用,爲什麼你需要使用另一種類型的地圖。 –

+0

您可以在'setgradeCutOff''中設置地圖。無論如何,不​​要擔心循環5個項目的數組。 –