如何从 java 中的双精度数组创建一个字符数组?
How to create a char array from a double array in java?
我有一个包含表示期中成绩的值的双精度数组,我需要创建一个具有相同值的字符数组,但我需要它来显示字母成绩。例如我需要从 {89.6, 73.9, 96.9} 到 {B, C, A}。到目前为止,这是我的代码:
int numStudents = 60;
int studNum = 1;
double[] midtermGrades = new double[numStudents];
Scanner grades = new Scanner(System.in);
System.out.println("Here are the scores for the most recent test taken by your class:");
for (int i = 0; i < midtermGrades.length; i++) {
midtermGrades[i] = (60 + (double)(Math.random() * 40));
System.out.printf("Student " + studNum++ + " : " + "%.1f\n", midtermGrades[i]);
}
double total = 0;
for (int i = 0; i < midtermGrades.length; i++) {
total += midtermGrades[i];
}
double studAvg = (total / midtermGrades.length);
System.out.printf("The average grade for your class was " + "%.1f\n", studAvg);
int aboveAvg = 0;
for (int i = 0; i < midtermGrades.length; i++) {
if (midtermGrades[i] > studAvg) {
aboveAvg++;
}
}
System.out.println("There are " + aboveAvg + " students in your class who scored above the average.\n");
char[] letterGrades = new char[midtermGrades.length];
for (int i = 0; i < midtermGrades.length; i++) {
letterGrades[i] = (char)midtermGrades[i];
}
}
您可以尝试为此使用不同的字符数组并指定评分标准
char midtermgrades2 = new char[numStudents] ;
for(i=0;i<midtermgrades.length;i++)
{If(midtermsgrades[i]<100 && midtermsgrades[i]>80)
Midtermgrades2[i]='A';
else
//specify more conditions like this
}
首先,你必须有一个基于分数的等级映射。在下面的例子中,我有如下映射,
- 分数 > 90 - A 级
- 分数在 80 和 90 之间 - B 级
- 分数在 70 和 80 之间 - C 级等等
char[] letterGrades = new char[midtermGrades.length];
for (int i = 0; i < midtermGrades.length; i++) {
letterGrades[i] = (char)midtermGrades[i];
}
您应该将代码中的上述块替换为以下代码
char[] letterGrades = new char[midtermGrades.length];
for (int i = 0; i < midtermGrades.length; i++) {
if (midtermGrades[i] >= 90) {
letterGrades[i] = 'A';
} else if (midtermGrades[i] >=80) {
letterGrades[i] = 'B';
} else if (midtermGrades[i] >=70) {
letterGrades[i] = 'C';
} else if (midtermGrades[i] >=60) {
letterGrades[i] = 'D';
} else if (midtermGrades[i] >=50) {
letterGrades[i] = 'E';
} else {
letterGrades[i] = '-';
}
}
希望这对您有所帮助:)
另一种方法是使用 ASCII table。例如96.9的第10位是9
,字符A
和J
的十进制值分别是65
和74
。因此,可以用9
减去74
得到字符A
对应的十进制值。以下代码片段显示了如何将 double
数组转换为预期的 char
数组:
代码片段
double[] midtermGrades = {89.6, 73.9, 96.9};
char[] letterGrades = new char[midtermGrades.length];
for (int i = 0; i < midtermGrades.length; i++) {
if (midtermGrades[i] < 60) {
letterGrades[i] = 'E';
} else if (midtermGrades[i] >= 90) {
letterGrades[i] = 'A';
} else {
letterGrades[i] = ((char)('J' - (int)midtermGrades[i]/10));
}
}
System.out.println(Arrays.toString(letterGrades));
控制台输出
[B, C, A]
您的第一个问题是制作一个有意义的数字 char !!!
Math.random() 只产生 0 到 1 之间的小数。
麻烦 是 Math.random() 是一种原始数据类型,作为双精度数和静态! , 此外,一个 字符的编号是一个 "integer number" 对应的代码页语言字符集符号,例如字符集 ISO_1152 是 ASCII,定义的符号少于 100 个,对应于一个整数。
Java 默认英文字符集是 IS0_8859-1 并且包含类似 UTF-8 的符号,从 0 整数到 255 整数的“整数值”。
如果 Math.random() 的结果四舍五入为一个整数值,它的基础数值将只是 1 或 0。
double dblval = (double)Math.random(); // (double) syntax casts the "static" context out to a normal value
int primaryconv = new Double(dblval).intValue(); // causes numeric rounding('narrowing' in the API docs) to an int
char[] myconversion = new String((new Integer(primaryconv).toString())).toCharArray(); // calls toCharArray() on String object inside default encoding
而不是使用 Integer 来缩小(将数字舍入到 long)
Math.round(double) 可以使用,returns a "long" 不是 int。
double dblval = (double)Math.random(); // (double) syntax casts the "static" out (removes static context) to a normal value
String primaryconv = new Long((long)Math.round(dblval)).toString(); // note the EXTRA running cast to "long' to remove 'static' context
char[] myconversion = primaryconv.toCharArray(); // calls toCharArray() on String object inside default encoding
如果第 3 方库是一个选项并且可以忽略装箱造成的开销,最简单和最干净的解决方案是使用 guava 中的 com.google.common.collect.RangeMap。
final RangeMap<Double, String> grades = ImmutableRangeMap.<Double, String> builder()//
.put(Range.closed(90D, 100D), "A")//
.put(Range.closedOpen(80D, 90D), "B")//
.put(Range.closedOpen(70D, 80D), "C")//
//so on
.build();
System.err.println("99.9 -> " + grades.get(99.9));
System.err.println("77.8 -> " + grades.get(77.8));
这将产生以下结果:
99.9 -> A
77.8 -> C
您唯一需要注意的是范围不要重叠。
我有一个包含表示期中成绩的值的双精度数组,我需要创建一个具有相同值的字符数组,但我需要它来显示字母成绩。例如我需要从 {89.6, 73.9, 96.9} 到 {B, C, A}。到目前为止,这是我的代码:
int numStudents = 60;
int studNum = 1;
double[] midtermGrades = new double[numStudents];
Scanner grades = new Scanner(System.in);
System.out.println("Here are the scores for the most recent test taken by your class:");
for (int i = 0; i < midtermGrades.length; i++) {
midtermGrades[i] = (60 + (double)(Math.random() * 40));
System.out.printf("Student " + studNum++ + " : " + "%.1f\n", midtermGrades[i]);
}
double total = 0;
for (int i = 0; i < midtermGrades.length; i++) {
total += midtermGrades[i];
}
double studAvg = (total / midtermGrades.length);
System.out.printf("The average grade for your class was " + "%.1f\n", studAvg);
int aboveAvg = 0;
for (int i = 0; i < midtermGrades.length; i++) {
if (midtermGrades[i] > studAvg) {
aboveAvg++;
}
}
System.out.println("There are " + aboveAvg + " students in your class who scored above the average.\n");
char[] letterGrades = new char[midtermGrades.length];
for (int i = 0; i < midtermGrades.length; i++) {
letterGrades[i] = (char)midtermGrades[i];
}
}
您可以尝试为此使用不同的字符数组并指定评分标准
char midtermgrades2 = new char[numStudents] ;
for(i=0;i<midtermgrades.length;i++)
{If(midtermsgrades[i]<100 && midtermsgrades[i]>80)
Midtermgrades2[i]='A';
else
//specify more conditions like this
}
首先,你必须有一个基于分数的等级映射。在下面的例子中,我有如下映射,
- 分数 > 90 - A 级
- 分数在 80 和 90 之间 - B 级
- 分数在 70 和 80 之间 - C 级等等
char[] letterGrades = new char[midtermGrades.length];
for (int i = 0; i < midtermGrades.length; i++) {
letterGrades[i] = (char)midtermGrades[i];
}
您应该将代码中的上述块替换为以下代码
char[] letterGrades = new char[midtermGrades.length];
for (int i = 0; i < midtermGrades.length; i++) {
if (midtermGrades[i] >= 90) {
letterGrades[i] = 'A';
} else if (midtermGrades[i] >=80) {
letterGrades[i] = 'B';
} else if (midtermGrades[i] >=70) {
letterGrades[i] = 'C';
} else if (midtermGrades[i] >=60) {
letterGrades[i] = 'D';
} else if (midtermGrades[i] >=50) {
letterGrades[i] = 'E';
} else {
letterGrades[i] = '-';
}
}
希望这对您有所帮助:)
另一种方法是使用 ASCII table。例如96.9的第10位是9
,字符A
和J
的十进制值分别是65
和74
。因此,可以用9
减去74
得到字符A
对应的十进制值。以下代码片段显示了如何将 double
数组转换为预期的 char
数组:
代码片段
double[] midtermGrades = {89.6, 73.9, 96.9};
char[] letterGrades = new char[midtermGrades.length];
for (int i = 0; i < midtermGrades.length; i++) {
if (midtermGrades[i] < 60) {
letterGrades[i] = 'E';
} else if (midtermGrades[i] >= 90) {
letterGrades[i] = 'A';
} else {
letterGrades[i] = ((char)('J' - (int)midtermGrades[i]/10));
}
}
System.out.println(Arrays.toString(letterGrades));
控制台输出
[B, C, A]
您的第一个问题是制作一个有意义的数字 char !!!
Math.random() 只产生 0 到 1 之间的小数。 麻烦 是 Math.random() 是一种原始数据类型,作为双精度数和静态! , 此外,一个 字符的编号是一个 "integer number" 对应的代码页语言字符集符号,例如字符集 ISO_1152 是 ASCII,定义的符号少于 100 个,对应于一个整数。
Java 默认英文字符集是 IS0_8859-1 并且包含类似 UTF-8 的符号,从 0 整数到 255 整数的“整数值”。
如果 Math.random() 的结果四舍五入为一个整数值,它的基础数值将只是 1 或 0。
double dblval = (double)Math.random(); // (double) syntax casts the "static" context out to a normal value
int primaryconv = new Double(dblval).intValue(); // causes numeric rounding('narrowing' in the API docs) to an int
char[] myconversion = new String((new Integer(primaryconv).toString())).toCharArray(); // calls toCharArray() on String object inside default encoding
而不是使用 Integer 来缩小(将数字舍入到 long) Math.round(double) 可以使用,returns a "long" 不是 int。
double dblval = (double)Math.random(); // (double) syntax casts the "static" out (removes static context) to a normal value
String primaryconv = new Long((long)Math.round(dblval)).toString(); // note the EXTRA running cast to "long' to remove 'static' context
char[] myconversion = primaryconv.toCharArray(); // calls toCharArray() on String object inside default encoding
如果第 3 方库是一个选项并且可以忽略装箱造成的开销,最简单和最干净的解决方案是使用 guava 中的 com.google.common.collect.RangeMap。
final RangeMap<Double, String> grades = ImmutableRangeMap.<Double, String> builder()//
.put(Range.closed(90D, 100D), "A")//
.put(Range.closedOpen(80D, 90D), "B")//
.put(Range.closedOpen(70D, 80D), "C")//
//so on
.build();
System.err.println("99.9 -> " + grades.get(99.9));
System.err.println("77.8 -> " + grades.get(77.8));
这将产生以下结果:
99.9 -> A
77.8 -> C
您唯一需要注意的是范围不要重叠。