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

Java等级类,字母等级到数字,java,Java,我正在写一个字母等级的程序。A得4.0分,B得3.0分,以此类推。如果输入B+或B-,则分别需要减去.3或相加.3,因此B+将为3.3 在我的代码中,当我测试像B+这样的字母时,它给出的是.3,而不是实际返回实际分数的减去值。我做错了什么 public class Grade { private String grade; private double gradeNum; // Constructor public Grade(String showGrade)

我正在写一个字母等级的程序。A得4.0分,B得3.0分,以此类推。如果输入B+或B-,则分别需要减去.3或相加.3,因此B+将为3.3

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

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

您需要重新订购代码:

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 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 -1.0;
    }



    String suffix;
    suffix = grade.substring(1);

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

    }

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







    return gradeNum;

}

您需要重新订购代码:

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 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 -1.0;
    }



    String suffix;
    suffix = grade.substring(1);

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

    }

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







    return gradeNum;

}

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

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中添加或减去已正确初始化的gradeNum

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;

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

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中添加或减去已正确初始化的gradeNum

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;

我一点也不喜欢这个设计

为什么要一次又一次地重新计算数值呢?这毫无意义

使Grade不可变,并在获得字母值时计算构造函数中的数值

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

您还可以考虑将Grade设置为枚举,如下所示:

/**
 * 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;
    }
}

我一点也不喜欢这个设计

为什么要一次又一次地重新计算数值呢?这毫无意义

使Grade不可变,并在获得字母值时计算构造函数中的数值

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

您还可以考虑将Grade设置为枚举,如下所示:

/**
 * 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;
    }
}

当你收到信时,你用

String letterGrade = grade.substring(0);
但您从未指定结束位置。您可以执行以下操作

String letterGrade = grade.substring(0,1);  // the end position is exclusive

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

String letterGrade = grade.substring(0);
但您从未指定结束位置。您可以执行以下操作

String letterGrade = grade.substring(0,1);  // the end position is exclusive


是的,设置字母值后,您应该添加/减去+和-修改。编写一个java程序,要求用户输入字母等级号。该程序将根据下表显示输入字母号的等效字母等级和点。编写一个java程序,要求用户输入字母等级编号程序将根据下表显示输入字母编号的等效字母等级和点。您需要计算平均等级,然后减去-的值或加上+可读性提示的值:在Java 7中,您可以直接对字符串进行切换,而不是长的if-else-if-else块。您需要计算平均等级,然后减去-的值或加上+可读性提示的值:在Java 7中,您可以直接对字符串进行切换,而不是长的if-else-if-else块。您还应该在发现等级无效后返回。您的letterGrade-if中没有一个与+匹配,B-等。你也应该在等级被发现无效后返回。你的letterGrade ifs中没有一个与A+、B-等匹配。这将起作用,但我确实认为枚举是解决此问题的更好方法。感谢这一点,我想我的代码现在完全有意义了。唯一的问题是,对于else语句,如果用户输入了无效的字母等级,比如G或J等,我想用它来提示用户返回错误。。为什么要在else中添加返回gradeNum?@sage88是的,Enum最适合这里,但我只是关注了这里的逻辑缺陷。@Shire在您打印错误后返回,因此用户可以看到他/她传递了一个无效的等级字母。其次,如果我们不把返回值放在那里,程序将继续处理后缀,对于无效的等级字母,比如X+,可以返回0.3或-0.3的gradeNum。哦,我明白了,非常酷。最后一件事是有一种方法可以使a和a+都是4.0,因为我从a+中减去了a.3。在不改变后缀if语句的情况下,正确地计算出来似乎是很重要的。这会起作用,但我确实认为枚举是解决这个问题的更好的方法。感谢它完美地工作了,我想我的代码已经出了问题,现在完全有意义了。唯一的问题是,对于else语句,如果用户输入了无效的字母等级,比如G或J等,我想用它来提示用户返回错误。。为什么要在else中输入return gradeNum?@sage88是的,Enum
将最适合这里,但我只是专注于这里的逻辑缺陷。@Shire在您打印错误后返回,因此用户可以看到他/她传递了一个无效的分数字母。其次,如果我们不把返回值放在那里,程序将继续处理后缀,对于无效的等级字母,比如X+,可以返回0.3或-0.3的gradeNum。哦,我明白了,非常酷。最后一件事是有一种方法可以使a和a+都为4.0,因为我从a+中减去a.3。在不改变后缀if语句的情况下,正确地得出这一结果似乎有点不寻常。是的,有更好的方法可以做到这一点,但我的老师坚持我们这样做是为了计算机科学141课Java入门。。我们不能使用枚举,因为他们还没有检查过那些东西。我们被命令只使用if语句来编写这个程序。我关于使分数不可变并在ctor中进行的评论仍然有效。是的,有更好的方法可以做到这一点,但我的老师坚持我们在计算机科学141课Java简介中这样做。。我们不能使用枚举,因为他们还没有检查过那些东西。我们被命令只使用if语句编写此程序。我关于使Grade不可变并在ctor中执行此操作的评论仍然有效。如果我只查找第一个元素,那么当我只能执行0第一个元素时是否有必要执行0,1?@Shire 0,1中的第一个索引指示从何处开始包含,第二个索引指示从何处结束独占。如果不传递1,它将一直假定到字符串的末尾,因此也返回+或-。如果我只查找第一个元素,那么当我只能执行0第一个元素时,是否有必要执行0,1?@Shire 0,1中的第一个索引指示从何处开始包含,第二个索引指示从何处结束独占。如果你没有通过1,它将一直假设到字符串的末尾,因此也返回+或-欢迎来到StackOverflow!我们是来帮忙的,但你得让我们各让一半。展示您尝试过的内容以及失败的原因。欢迎使用StackOverflow!我们是来帮忙的,但你得让我们各让一半。展示你的尝试以及失败的原因。