如何从 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,字符AJ的十进制值分别是6574。因此,可以用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

您唯一需要注意的是范围不要重叠。