首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java等级类,字母等级到数字

Java等级类,字母等级到数字
EN

Stack Overflow用户
提问于 2013-05-25 05:51:08
回答 5查看 10.9K关注 0票数 1

我正在写一个接受字母评分的程序。A会得到4.0,B会得到3.0,以此类推。如果您输入B+或B-,则将分别采用减去.3或添加.3 (因此B+将为3.3)。

在我的代码中,当我测试像B+这样的字母时,它会给我.3,而不是实际返回实际成绩的减去的值。我做错了什么?

代码语言:javascript
运行
复制
public class Grade {
    private String grade;
    private double gradeNum;

    // Constructor
    public Grade(String showGrade) {
        grade = showGrade;
        gradeNum = 0;
    }

    // getNumericGrade method to return grade number
    public double getNumericGrade() {
        String suffix;
        suffix = grade.substring(1);

        if(suffix.equals("+")) {
            gradeNum = gradeNum + .3;
        } else if(suffix.equals("-")) {
            gradeNum = gradeNum - .3;
        }

        String letterGrade = grade.substring(0);

        if(letterGrade.equalsIgnoreCase("A")) {
            gradeNum = 4.0;
        } else if(letterGrade.equalsIgnoreCase("B")) {
            gradeNum = 3.0;
        } else if(letterGrade.equalsIgnoreCase("C")) {
            gradeNum = 2.0;
        } else if(letterGrade.equalsIgnoreCase("D")) {
            gradeNum = 1.0;
        } else if(letterGrade.equalsIgnoreCase("F")) {
            gradeNum = 0.0;
        } else {
            System.out.println("Invalid letter grade");
        }

        return gradeNum;
    }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-05-25 05:58:26

您应该首先处理您的字母评分,以便它正确地初始化gradeNum。还要注意,substring(int index)返回一个子序列,它从传递的索引开始,一直到字符串的末尾。因此,您的letterGrade if块中没有一个与A+、B-等输入匹配。

代码语言:javascript
运行
复制
if (grade == null || !grade.matches("[A-F][+-]?")) // if grade wasn't specified, or
{// if grade is not between A to F *optionally* followed by a + or - sign
    System.out.println("Invalid letter grade");
    return gradeNum;
}

String letterGrade = grade.substring(0, 1); // pass 1 to exclude + or -

if (letterGrade.equalsIgnoreCase("A"))
{
    gradeNum = 4.0;
}
else if(letterGrade.equalsIgnoreCase("B"))
{
    gradeNum = 3.0;
}
else if(letterGrade.equalsIgnoreCase("C"))
{
  gradeNum = 2.0;
}
else if(letterGrade.equalsIgnoreCase("D"))
{
    gradeNum = 1.0;
}
else if(letterGrade.equalsIgnoreCase("F"))
{
    gradeNum = 0.0; // return from here if you want F = F- = F+
    return gradeNum; // if you want to invalidate F- and F+ look below
}
/* else // not required; already validated by using regex above
{
    System.out.println("Invalid letter grade");
    return gradeNum; // don't forget to RETURN from here
}*/

然后进行后缀处理,对已经正确初始化的gradeNum进行加减运算。

代码语言:javascript
运行
复制
String suffix;
suffix = grade.substring(1);
if (suffix.isEmpty()) { // return early if there's no suffix
    return gradeNum;
} else if (gradeNum == 0.0) { // to invalidate F- and F+
    System.out.println("Invalid letter grade");
    return gradeNum;
}
if(suffix.equals("+") && gradeNum != 4.0) // don't increment if grade is A+ (= A = 4.0)
{
    gradeNum = gradeNum + .3;
}
else if (suffix.equals("-"))
{
    gradeNum = gradeNum - .3;
}
return gradeNum;
票数 3
EN

Stack Overflow用户

发布于 2013-05-25 05:59:48

我一点也不喜欢这个设计。

为什么要付出一次又一次重新计算数值的惩罚呢?这没有任何意义。

当你得到字母值时,在构造函数中计算数值,并使等级不可变。

我还有另一个构造函数,它接受一个浮点数/双精度数并设置字母等级。

您也可以考虑将成绩设置为枚举,如下所示:

代码语言:javascript
运行
复制
/**
 * Grade encapsulates symbols with values
 * @author Michael
 * @link http://stackoverflow.com/questions/16744116/java-grade-class-letter-grade-to-number/16744210#16744210
 * @since 5/24/13 6:01 PM
 */
public enum Grade {
    APLUS("A+", 4.3),
    A("A", 4.0),
    AMINUS("A-", 3.7),
    BPLUS("B+", 3.3),
    B("B", 3.0),
    BMINUS("B-", 2.7),
    CPLUS("C+", 2.3),
    C("C", 2.0),
    CMINUS("C-", 1.7),
    DPLUS("D+", 1.3),
    D("D", 1.0),
    DMINUS("D-", 0.7),
    F("F", 0.0);

    private final String symbol;
    private final double value;

    Grade(String symbol, double value) {
        this.symbol = symbol;
        this.value = value;
    }

    public String getSymbol() {
        return symbol;
    }

    public double getValue() {
        return value;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2013-05-25 06:01:24

当你收到你的信时,你用

代码语言:javascript
运行
复制
String letterGrade = grade.substring(0);

但是你从来没有指定一个结束的位置。您可以执行以下操作

代码语言:javascript
运行
复制
String letterGrade = grade.substring(0,1);  // the end position is exclusive

here's some substring documentation

是的,您应该在设置字母值之后添加/减去对+-的修改

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16744116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档