我是java的初学者,我很难让这段代码工作。我试图读取CSV文件,然后使用该数据计算平均值,然后返回平均值的最高和平均值的摘要。
输入如下:
Alicia Marks,89,90,100,95,75,85,94,100,90,92
Bobby Ricks,98,79,87,79,9,98,7,19,98,78
以下是输出应该是什么样的(数字不正确,只有示例):
Alicia Marks 85.5 B
Bobby Ricks 90.0 A -
...
高98.2
低56.5
平均值78.3333
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
public class Test
{
public static void main(String[] args)
{
Test x = new Test();
x.high();
}
public void high()
{
File file2 = new File("scores.csv");
try
{
Scanner scanner = new Scanner(file2);
while (scanner.hasNextLine())
{
String line2 = scanner.nextLine();
String[] value2 = line2.split(",");
// Converts String Array into Double Array
double[] score = new double[value2.length];
for (int i = 1; i < value2.length; i++)
{
score[i] = Double.parseDouble(value2[i]);
}
// Finds the sum and then the average, adds it to a array List
ArrayList<Double> av;
av = new ArrayList<Double>();
double sumNum = 0.0;
for (double i : score)
{
sumNum += i;
}
double aver = sumNum / 10;
av.add(aver);
double max = 0, min = 100;
for (int a = 0; a < av.size(); a++)
{
double s = av.get(a);
max = Math.max(max, s);
min = Math.min(min, s);
aver += s;
}
System.out.println("High " + max + "");
System.out.println("Low " + min + "");
System.out.println("Average " + aver / av.size() + "");
}
scanner.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
}
}
我认为我遇到的问题是使用while循环,但我不太确定。任何帮助解决这个问题都会非常感激。
答案 0 :(得分:1)
阅读成绩的函数中有一个错误。您应该以这种方式修复它:
// Converts String Array into Double Array
double[] score = new double[value2.length - 1];
for (int i = 1; i < value2.length; i++) {
score[i - 1] = Double.parseDouble(value2[i]);
}
据我所知,你想要所有等级的最大,最小和平均值。那你的代码应该是这样的:
package it.unitn.uvq.antonio.processor;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Test x = new Test();
x.high();
}
public void high() {
File file2 = new File("/home/antonio/Scrivania/scores.csv");
try {
Scanner scanner = new Scanner(file2);
ArrayList<Double> avgs = new ArrayList<>();
double max = 0, min = 100;
while (scanner.hasNextLine()) {
String line2 = scanner.nextLine();
String[] value2 = line2.split(",");
// Converts String Array into Double Array
double[] score = new double[value2.length - 1];
for (int i = 1; i < value2.length; i++) {
score[i - 1] = Double.parseDouble(value2[i]);
}
// Finds the sum and then the average, adds it to a array List
double sumNum = 0.0;
for (double i : score) {
sumNum += i;
min = Math.min(min, i);
max = Math.max(max, i);
}
double avg = sumNum / 10;
avgs.add(avg);
System.out.println(avg);
}
scanner.close();
double avgsSum = .0;
for (double avg : avgs) {
avgsSum += avg;
}
System.out.println("High " + max + "");
System.out.println("Low " + min + "");
System.out.println("Average " + avgsSum / avgs.size() + "");
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
答案 1 :(得分:0)
如果你只想要每个学生的平均值,然后你想要的最小值和最大值以及总平均值,你可以这样做:
编辑添加了一个如何进行数字到字符转换的示例。注意:我不知道你是怎么判断它是B-还是D +等等。
import java.io.File;
import java.io.FileNotFoundException;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Test x = new Test();
x.high();
}
public void high() {
// to format the scores
DecimalFormat df = new DecimalFormat("###.#");
df.setRoundingMode(RoundingMode.HALF_UP);
ArrayList<Double> averages = new ArrayList<Double>();
File file2 = new File("scores.csv");
try {
Scanner scanner = new Scanner(file2);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
String[] values = line.split(",");
// Converts String Array into Double Array
double[] scoresPerPerson = new double[values.length];
for (int i = 1; i < values.length; i++) {
scoresPerPerson[i] = Double.parseDouble(values[i]);
}
// Finds the sum and then the average, adds it to a array List
double sum = 0.0;
for (double i : scoresPerPerson) {
sum += i;
}
double average = sum / values.length;
averages.add(average);
System.out.println(values[0] + ": " + df.format(average) + " "
+ getCharGrade(average));
}
scanner.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// Computes the average and get the max min
double max = 0;
double min = 100;
double totalAverage = 0;
for (double average : averages) {
if (average > max) {
max = average;
}
if (average < min) {
min = average;
}
totalAverage += average;
}
// Final step to get the general average
totalAverage /= averages.size();
// Print out the final general data
System.out.println();
System.out.println("High : " + df.format(max));
System.out.println("Low : " + df.format(min));
System.out.println("Average : " + df.format(totalAverage));
}
private String getCharGrade(double average) {
if (average >= 90) {
return "A";
} else if (average >= 80) {
return "B";
} else if (average >= 70) {
return "C";
} else if (average >= 60) {
return "D";
} else {
return "F";
}
}
}
<强>输出:强>
Alicia Marks: 82,7 B
Bobby Ricks: 59,3 F
High : 82,7
Low : 59,3
Average : 71