如何有效地将用户输入的字符转换为 Java 中的数值(双精度)?
How can I efficiently convert a user-input char into a numerical value (double) in Java?
我是编程新手,尤其是 Java,所以请耐心等待这可能是一个非常菜鸟的问题。我的主要目标是创建一个简单的程序,通过输入三个字符并将结果显示为双精度来计算用户的 GPA。对于这个程序,我只需要用相应的数值 (4.0-0.0) 表示基本字母等级(没有 A+ 或 A- 或类似的东西,只有 A-F)。
我能够让程序运行,但我的问题在于我必须转换或关联用户输入的方式 into/with 一个小数。
正如您在下面的代码中看到的那样,我的方法是让用户输入他们的字母等级,创建一个单独的变量来保存每个 class 和每个字符的数值使用 if 语句将该值与其对应的 class 中的对应字符相关联。虽然它似乎工作正常,但有没有更有效的方法呢?我发现 if 语句有点低效,因为它看起来像是我想要完成的很多代码。
此外,附带说明一下,我使用 Eclipse 作为 Java 的主要 IDE,当我在第一个“in”下时,我不断收到黄色警告波浪线消息输入“扫描仪 in = new Scanner(System.in);”它说“资源泄漏:'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
感谢您的帮助!
你可以为此使用“switch case”:
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.0
。 break
是一个更复杂的术语,但在 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, g2 = 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,这是一种奇怪的边缘情况)。这不是代码正在做什么的直观表示,因此我不推荐它。
综上所述,其中 none 的效率明显高于其他任何一种。它们的功能都相当相似(忽略最后的数字操作),因此运行时不会受到显着影响。有些看起来比其他的干净,这是值得的。
因为你的成绩是字符,你可以直接将它们转换成相应的整数(在google上查找ascii表,你会发现'A' = 65,'B' = 66 等)。也就是说我们可以直接对chars进行比较运算:
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()
。
我是编程新手,尤其是 Java,所以请耐心等待这可能是一个非常菜鸟的问题。我的主要目标是创建一个简单的程序,通过输入三个字符并将结果显示为双精度来计算用户的 GPA。对于这个程序,我只需要用相应的数值 (4.0-0.0) 表示基本字母等级(没有 A+ 或 A- 或类似的东西,只有 A-F)。
我能够让程序运行,但我的问题在于我必须转换或关联用户输入的方式 into/with 一个小数。
正如您在下面的代码中看到的那样,我的方法是让用户输入他们的字母等级,创建一个单独的变量来保存每个 class 和每个字符的数值使用 if 语句将该值与其对应的 class 中的对应字符相关联。虽然它似乎工作正常,但有没有更有效的方法呢?我发现 if 语句有点低效,因为它看起来像是我想要完成的很多代码。
此外,附带说明一下,我使用 Eclipse 作为 Java 的主要 IDE,当我在第一个“in”下时,我不断收到黄色警告波浪线消息输入“扫描仪 in = new Scanner(System.in);”它说“资源泄漏:'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
感谢您的帮助!
你可以为此使用“switch case”:
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.0
。 break
是一个更复杂的术语,但在 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, g2 = 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,这是一种奇怪的边缘情况)。这不是代码正在做什么的直观表示,因此我不推荐它。
综上所述,其中 none 的效率明显高于其他任何一种。它们的功能都相当相似(忽略最后的数字操作),因此运行时不会受到显着影响。有些看起来比其他的干净,这是值得的。
因为你的成绩是字符,你可以直接将它们转换成相应的整数(在google上查找ascii表,你会发现'A' = 65,'B' = 66 等)。也就是说我们可以直接对chars进行比较运算:
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()
。