微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Java 中有效地将用户输入的字符转换为数值双精度?

如何解决如何在 Java 中有效地将用户输入的字符转换为数值双精度?

我是编程的新手,尤其是在 Java 方面,所以请耐心回答一个非常菜鸟的问题。我在这里的主要目标是创建一个简单的程序,通过输入三个字符并将结果显示为双精度来计算用户的 GPA。对于这个程序,我只需要用相应的数值 (4.0-0.0) 来表示基本字母等级(没有 A+ 或 A- 或类似的东西,只有 A-F)。

我能够让程序运行,但是我的问题在于我必须将用户的输入转换为/与小数相关联的方式。

我的方法,正如你在下面的代码中看到的,是让用户输入他们的字母等级,创建一个单独的变量来保存每个类的每个字符的数值,并使用 if 语句来将该值与其对应类中的对应字符相关联。虽然它似乎工作正常,但有没有更有效的方法来做到这一点?我发现 if 语句有点低效,因为它看起来像我要完成的任务的很多代码

另外,顺便提一下,我使用 Eclipse 作为 Java 的主要 IDE,当我输入“Scanner in = new Scanner(System.在);”它说“资源泄漏:'in'永远不会关闭”,我不知道这意味着什么。我的程序总是在运行,但我讨厌在包资源管理器中看到我的文件上的警告标志:/

* Lab9.java
package labs;
import java.util.Scanner;

public class Lab9 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // Todo Auto-generated method stub
        System.out.print("Please input 3 letter grades: ");
        @SuppressWarnings("resource")
        Scanner in = new Scanner(system.in);
        char class1 = in.next() .charat(0);
        char class2 = in.next() .charat(0);
        char class3 = in.next() .charat(0);
    
        double g1 = 0,g2 = 0,g3 = 0;
    
        if (class1 == 'A') {
            g1 = 4.0;
        }
        if (class1 == 'B') {
            g1 = 3.0;
        }
        if (class1 == 'C') {
            g1 = 2.0;
        }
        if (class1 == 'D') {
            g1 = 1.0;
        }
        if (class1 == 'F') {
            g1 = 0.0;
        }
    
        if (class2 == 'A') {
            g2 = 4.0;
        }
        if (class2 == 'B') {
            g2 = 3.0;
        }
        if (class2 == 'C') {
            g2 = 2.0;
        }
        if (class2 == 'D') {
            g2 = 1.0;
        }
        if (class2 == 'F') {
            g2 = 0.0;
        }
    
        if (class3 == 'A') {
            g3 = 4.0;
        }
        if (class3 == 'B') {
            g3 = 3.0;
        }
        if (class3 == 'C') {
            g3 = 2.0;
        }
        if (class3 == 'D') {
            g3 = 1.0;
        }
        if (class3 == 'F') {
            g3 = 0.0;
        }
    
        System.out.print("Your GPA is a "+((g1 + g2 + g3)/3));
    }
}

这是测试运行的输出

Please input 3 letter grades: A C B
Your GPA is a 3.0

感谢您的帮助!

解决方法

您可以为此使用“切换案例”:

public static void main(String[] args) {

    System.out.print("Please input 3 letter grades: ");
    @SuppressWarnings("resource")
    Scanner in = new Scanner(System.in);
    char class1 = in.next().charAt(0);
    char class2 = in.next().charAt(0);
    char class3 = in.next().charAt(0);

    double g1 = 0,g2 = 0,g3 = 0;

    g1 = charToDouble(class1);
    g2 = charToDouble(class2);
    g3 = charToDouble(class3);

    System.out.print("Your GPA is a " + ((g1 + g2 + g3) / 3));
}

static double charToDouble(char className) {
    switch (className) {
        case 'A':
            return 4.0;
        case 'B':
            return 3.0;
        case 'C':
            return 2.0;
        case 'D':
            return 1.0;
        case 'F':
            return 0.0;
        default:
            throw new IllegalStateException("Unexpected value: " + (className));
    }
}
,

虽然 if 语句工作得很好,但还有一些更像 Java 的实现,主要使用 Java 中的 switch ... case 语句(更多信息可以在 Oracle's Page 上阅读)。

本质上,if 语句可以替换为

...
switch(class1) {
                 case 'A':       g1 = 4.0;
                                 break;
                 case 'B':       g1 = 3.0;
                                 break;
                 case 'C':       g1 = 2.0;
                                 break;
                 case 'D':       g1 = 1.0;
                                 break;
                 default:        g1 = 0.0;
                                 break;
         }

         switch(class2) {
                 case 'A':       g2 = 4.0;
                                 break;
                 case 'B':       g2 = 3.0;
                                 break;
                 case 'C':       g2 = 2.0;
                                 break;
                 case 'D':       g2 = 1.0;
                                 break;
                 default:        g2 = 0.0;
                                 break;
        }
          switch(class3) {
                 case 'A':       g3 = 4.0;
                                 break;
                 case 'B':       g3 = 3.0;
                                 break;
                 case 'C':       g3 = 2.0;
                                 break;
                 case 'D':       g3 = 1.0;
                                 break;
                 default:        g3 = 0.0;
                                 break;
         }
...

default 语句还可以用作一些错误处理,接收任何恶意值并为其分配 0.0break 是一个更复杂的术语,但在 switch case 语句中需要它。

除此之外,您还可以创建一种方法来减少重复代码。

public class Lab9 {
     /**
      * @param letter
      */
      private static double letterValue(char letter) {
         double value = 0.0;
         switch(letter) {
                 case 'A':       value = 4.0;
                                 break;
                 case 'B':       value = 3.0;
                                 break;
                 case 'C':       value = 2.0;
                                 break;
                 case 'D':       value = 1.0;
                                 break;
                 default:        value = 0.0;
                                 break;
         }
         return(value);
     }
     /**
      * @param args
      */
     public static void main(String[] args) {
         // TODO Auto-generated method stub
         System.out.print("Please input 3 letter grades: ");
         @SuppressWarnings("resource")
         Scanner in = new Scanner(System.in);
         char class1 = in.next() .charAt(0);
         char class2 = in.next() .charAt(0);
         char class3 = in.next() .charAt(0);
         double g1 = 0,g3 = 0;
         g1 = Lab9.letterValue(class1);
         g2 = Lab9.letterValue(class2);
         g3 = Lab9.letterValue(class3);
         System.out.print("Your GPA is a "+((g1 + g2 + g3)/3));
     }
 }

要使用最少的代码来完成,您实际上可以利用字符具有数字表示的事实(通常使用 ASCII Enconding 框架)。这将允许您简化方法。这使用了一些更高级的主题,例如类型转换,所以要小心。

     private static double letterValue(char letter) {
         double value = 0.0;
         if((int)letter < 70) {
                 value = (((int)letter) - 69) * -1;
         }
         return(value);
     }

本质上,这取字母 (A: 65,B: 66,...) 的数值并减去 69 使它们成为相关的负值,然后将它们翻转为正值。它将超出范围的任何值分配为 0.0(包括 Es,这是一个奇怪的边缘情况)。这不是代码正在做什么的直观表示,所以我不推荐它。

综上所述,这些都没有比其他任何一个更有效。它们的功能都相当相似(忽略最后的数字运算),因此运行时不会受到显着影响。有些看起来比其他的更干净,这是值得的。

,

由于你的成绩是字符,你可以直接将它们转换成相应的整数(在谷歌上查找ascii表,你会发现'A' = 65,'B' = 66等等)。这意味着我们可以直接对字符进行比较和算术:

double getGrade(char class) {
    if (class == 'F') return 0;       // We first check the outlier 'F'
    if (class >= 'A' && class <= 'D') // This ensures the value class is 'A','B','C' or 'D'
        return 4 - (class - 'A');     // if class is 'A',then class - 'A' is 0,// if class is 'B',then class - 'A' is 1,etc.
    return -1; // invalid case,maybe throw an error here instead of returning -1
}

至于资源泄漏,通常的做法是在使用完后关闭扫描仪。在您的情况下,这将在您的主要方法结束时调用 in.close()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。