如何查找来自csv文件的数组列表的平均标记(JAVA)
我有一个csv文件,其中有一个包含学生id、姓氏、名、标记、电话号码等的列表。我将它们组织成一个数组列表,这样当你调用如何查找来自csv文件的数组列表的平均标记(JAVA),java,arrays,csv,netbeans-platform,Java,Arrays,Csv,Netbeans Platform,我有一个csv文件,其中有一个包含学生id、姓氏、名、标记、电话号码等的列表。我将它们组织成一个数组列表,这样当你调用stu[100]时,标记将在csv文件列表中找到第100个学生的标记。有1000名学生。我需要计算所有学生的总平均分数(每个学生只有一个分数),我把它放在一个循环中,但它只是打印出他们的分数。如果你需要更多的细节,我道歉 代码如下: 公共班级学生中心{ public static String user; public int StuRec; public static int
stu[100]时,标记将在csv文件列表中找到第100个学生的标记。有1000名学生。我需要计算所有学生的总平均分数(每个学生只有一个分数),我把它放在一个循环中,但它只是打印出他们的分数。如果你需要更多的细节,我道歉
代码如下:
公共班级学生中心{
public static String user;
public int StuRec;
public static int numstu;
public static double average;
//public static StuRec[] stu;
static StuRec[] stu = new StuRec[1000];
public static void main(String[] args) throws IOException {
for (int i = 0; i < 1000; i++) {
stu[i] = new StuRec();
}
StuRec stu = new StuRec();
readFile(user);
menu();
}
public static String filename;
Scanner reader = new Scanner(filename);
public static Boolean readFile(String filename) throws IOException { //Constructor for filename
try {
Scanner userInput = new Scanner(System.in);
System.out.println("Type R To Read a File or Type Default for the default file");
user = userInput.nextLine();
if (user.equalsIgnoreCase("r")) {
user = userInput.nextLine();
}
filename = user;
if (user.equalsIgnoreCase("default")) {
filename = "newreg2.csv";
}
Scanner input = new Scanner(new FileReader(filename));
while (input.hasNext()) {
in(input.nextLine());
numstu++;
}
input.close();
return true;
} catch (IOException e) {
System.err.println(e.getMessage());
}
return false;
}
public static void in(String reader) {
String splitter[];
splitter = reader.split(",");
stu[numstu] = new StuRec();
stu[numstu].studentID = splitter[0];
stu[numstu].lastName = splitter[1];
stu[numstu].firstName = splitter[2];
stu[numstu].phoneNumber = splitter[3];
stu[numstu].courseCode = splitter[4];
stu[numstu].periodNumber = Integer.parseInt(splitter[5]); // parseInt turns a string of digits into an integer
stu[numstu].mark = Integer.parseInt(splitter[6]);
}
public static boolean menu() {
int total = 0;
String choice;
Scanner userInput = new Scanner(System.in);
System.out.println("=============================================");
System.out.println("Type R To Read Another File");
System.out.println("Type L To Print all File Records");
System.out.println("Type AA To Print The Average Of All The Marks");
choice = userInput.nextLine();
for (int i = 0; i < numstu; i++) {
if (choice.equalsIgnoreCase("L")) {
System.out.println(stu[i].lastName + ", " + stu[i].firstName + ", " + stu[i].studentID + ", " + stu[i].phoneNumber + ", " + stu[i].courseCode + ", " + stu[i].periodNumber + ", " + stu[i].mark);
}else if (choice.equalsIgnoreCase("R")){
} else if (choice.equalsIgnoreCase("AA")) {
total = total + stu[i].mark;
} else {
System.err.println("Unknown Key Try Again...");
}
average = total / 1000; // compute the average.
System.out.println(average);
} return menu();
公共静态字符串用户;
公共国际贸易委员会;
公共静态int numstu;
公共静态双平均;
//公共静电室[]stu;
静态StuRec[]stu=新StuRec[1000];
公共静态void main(字符串[]args)引发IOException{
对于(int i=0;i<1000;i++){
stu[i]=new StuRec();
}
StuRec stu=新StuRec();
读取文件(用户);
菜单();
}
公共静态字符串文件名;
扫描仪阅读器=新扫描仪(文件名);
公共静态布尔读取文件(字符串文件名)引发IOException{//文件名构造函数
试一试{
扫描仪用户输入=新扫描仪(System.in);
System.out.println(“键入R读取文件或键入默认文件的默认值”);
user=userInput.nextLine();
if(user.equalsIgnoreCase(“r”)){
user=userInput.nextLine();
}
filename=用户;
if(user.equalsIgnoreCase(“默认”)){
filename=“newreg2.csv”;
}
扫描仪输入=新扫描仪(新文件读取器(文件名));
while(input.hasNext()){
in(input.nextLine());
numstu++;
}
input.close();
返回true;
}捕获(IOE异常){
System.err.println(e.getMessage());
}
返回false;
}
中的公共静态无效(字符串读取器){
字符串拆分器[];
splitter=reader.split(“,”);
stu[numstu]=新StuRec();
stu[numstu].studentID=splitter[0];
stu[numstu].lastName=splitter[1];
stu[numstu].firstName=splitter[2];
stu[numstu].phoneNumber=splitter[3];
stu[numstu].courseCode=splitter[4];
stu[numstu].periodNumber=Integer.parseInt(拆分器[5]);//parseInt将一串数字转换为整数
stu[numstu].mark=Integer.parseInt(拆分器[6]);
}
公共静态布尔菜单(){
int-total=0;
字符串选择;
扫描仪用户输入=新扫描仪(System.in);
System.out.println(“======================================================================”);
System.out.println(“键入R读取另一个文件”);
System.out.println(“键入L以打印所有文件记录”);
System.out.println(“键入AA以打印所有标记的平均值”);
choice=userInput.nextLine();
对于(int i=0;i
}
}您的平均例程计算不正确。它只是简单地把第n个标记加上它自己,除以1000。因为您使用的是整数,所以它只会向下取整,有效地在每次迭代中给您第n个标记+0作为平均值,在循环完成时给您留下最后一个标记
您需要不断地将平均值相加,然后在得到值时除以1000
public static boolean menu() {
String choice;
Scanner userInput = new Scanner(System.in);
System.out.println("=============================================");
System.out.println("Type R To Read Another File");
System.out.println("Type L To Print all File Records");
System.out.println("Type AA To Print The Average Of All The Marks");
choice = userInput.nextLine();
for (int i = 0; i < numstu; i++) {
if (choice.equalsIgnoreCase("L")) {
System.out.println(stu[i].lastName + ", " + stu[i].firstName + ", " + stu[i].studentID + ", " + stu[i].phoneNumber + ", " + stu[i].courseCode + ", " + stu[i].periodNumber + ", " + stu[i].mark);
}else if (choice.equalsIgnoreCase("R")){
} else if (choice.equalsIgnoreCase("AA")) {
average += stu[i].mark; // keep adding to average
} else {
System.err.println("Unknown Key Try Again...");
}
}
// divide by zero protection
if ( numstu > 0 ) {
average = average/numstu; // compute the average. Always use the size in terms of a variable whenever possible.
System.out.println(average); // as noted below, if this is an integer value, < #of students computations will eval to 0.
// might be better to use double
}
else {
System.out.println("Oops! No students! :(");
}
return menu();
}
publicstaticboolean菜单(){
字符串选择;
扫描仪用户输入=新扫描仪(System.in);
System.out.println(“======================================================================”);
System.out.println(“键入R读取另一个文件”);
System.out.println(“键入L以打印所有文件记录”);
System.out.println(“键入AA以打印所有标记的平均值”);
choice=userInput.nextLine();
对于(int i=0;i0){
average=average/numstu;//计算平均值。尽可能使用变量的大小。
System.out.println(average);//如下所述,如果这是一个整数值,<#个学生的计算将求值为0。
//可能最好使用双精度
}
否则{
System.out.println(“哦!没有学生!:(”);
}
返回菜单();
}
请注意,您的菜单有点低效,但手头的问题应该得到解决。这句话就是问题所在
average = stu[i].mark + stu[i].mark / 1000;
这不会累计总数。请尝试
total = total + stu[i].mark;
然后在最后,在循环之外
average = total / 1000;
其他人已经指出了没有正确计算分数之和的问题,即平均计算的分子。我想重点讨论分数的数量问题,即平均计算的分母
想想现实世界。正如其他人所提到的,你不能依赖于文件中的学生数量是固定的。文件/班级大小可以变化,所以你不能除以固定的数字
但你也不能依赖scor的数量