Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何查找来自csv文件的数组列表的平均标记(JAVA)_Java_Arrays_Csv_Netbeans Platform - Fatal编程技术网

如何查找来自csv文件的数组列表的平均标记(JAVA)

如何查找来自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

我有一个csv文件,其中有一个包含学生id、姓氏、名、标记、电话号码等的列表。我将它们组织成一个数组列表,这样当你调用
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的数量