从文件中将整数添加到数组

3

我有一份学生分数的txt文件,每行代表一个新学生。我想将每个学生的第一个分数添加到一个数组中,将每个学生的第二个分数添加到另一个数组中,以此类推。每个数组都是一个模块,然后我有方法来查找这些模块分数的平均值和中位数等,但我很难读取每一行并添加每一行的第一个值等。

public interface StatCalculator {
   double[] CE1014FY = {};
   double[] CE1014SP = {};
   double[] CE1414AU = {};
   double[] CE1414FY = {};
   double[] CE1424AU = {};
   double[] CE1424FY = {};
   double[] CE1514AU = {};
   double[] CE1524SP = {};
   double[] CE1534AU = {};
   double[] CE1544SP = {};
   double[] CE1554SP = {};
   double[] CE1614AU = {};
   double[] CE1624SP = {};
   double[] CE1634AU = {};
   double[] CE1644SP = {};

   static void get(){
     try {
        File file = new         File("M:\\Documents\\ce201\\subversion\\resources\\marks.txt");
        Scanner scanner = new Scanner(file);
       for every line
          CE1014FY.add(line[0];         //i want something like this
          CE1014SP.add(line[1]

        scanner.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }


}

static double mean(double[] numbers){

    double sum = 0;
    for (int i = 0; i < numbers.length; i++) {
        sum += numbers[i];

    }
    System.out.println("mean: "+sum/numbers.length);
    return sum / numbers.length;

}

public static double median(double[] numbers) {
    Arrays.sort(numbers);
    int middle = numbers.length/2;
    if (numbers.length%2 == 1) {
        System.out.println("median: "+numbers[middle]);
        return numbers[middle];
    } else {
        System.out.println("median: "+(numbers[middle-1] + numbers[middle]) / 2.0);
        return (numbers[middle-1] + numbers[middle]) / 2.0;

    }
}

public static double lowerQ(double[] numbers) {
    Arrays.sort(numbers);
    int lqpos = (numbers.length+1)/4;
    int lq= (int) (int) numbers[lqpos];
    System.out.println("lower q: "+lq);
    return lq;
}

public static double upperQ(double[] numbers) {
    Arrays.sort(numbers);
    int uqpos = 3*(numbers.length+1)/4;
    int uq= (int) (int) numbers[uqpos];
    System.out.println("upper q: "+uq);
    return uq;
}

public static void main(String[] args) {
    get();
    mean(CE1014FY);
    median(CE1014FY);
    upperQ(CE1014FY);
    lowerQ(CE1014FY);
}

然后将txt内容{

  63,-1,-1,76,-1,-1,82,85,84,57,67,73,-1,-1,-1,-1,73
  62,-1,-1,60,-1,-1,89,76,79,53,55,77,-1,-1,-1,-1,69
  60,-1,-1,42,-1,-1,37,32,67,-1,44,56,37,-1,-1,-1,47
  53,-1,-1,88,-1,-1,75,68,69,58,64,75,-1,-1,-1,-1,69
  72,-1,-1,64,-1,-1,39,55,74,56,78,64,-1,-1,-1,-1,63
  50,-1,-1,30,-1,-1,19,20,35,19,7,34,-1,-1,-1,-1,27

}


2
能否请你把问题具体化一点?目前来看,我认为我需要把你的代码放入IntelliJ中进行调试才能找出问题所在。 - Tim Biegeleisen
marks.txt的格式是什么? - brad
@brad,它有130行17个数字,例如:-1、20、35、45、-1 10...等等。其中-1表示他们没有选修该模块。 - sb33
@BrankVictoria 我知道没有添加方法,只是平均数、中位数等方法都使用数组而不是列表,所以我不确定改变它们的工作方式是否明智。 - sb33
@domdom 这里没有任何名称或其他信息 - 只有这些标记:56,-1,-1,48,-1,-1,41,18,66,24,13,60,-1,-1,-1,-1,41 43,-1,-1,-1,-1,41,44,-1,-1,-1,34,50,47,39,32,-1,41 - sb33
显示剩余3条评论
2个回答

1

我建议使用列表(lists)而不是数组(arrays),因为数组没有“Add2”方法。你还应该使用BufferedReader对象,这样你就可以逐行读取文本文件,考虑到每一行都是一个标记,你可以使用计数器来知道你所在的行,从而知道你需要使用哪种列表方法进行存储。因此,你的get方法应该像这样:

   static void get(){
     try {
        File file = new File("M:\\Documents\\ce201\\subversion\\resources\\marks.txt");
            BufferedReader br = new BufferedReader(new FileReader(file));
            String line;
            int count = 1;
            while((line = br.readLine()) != null)
            {
                switch(count)
                {
                    case 1:
                        CE1014FY.add(Double.parseDouble(line));
                        break;
                    case 2:
                        CE1014SP.add(Double.parseDouble(line));
                        break;
                    case 3:
                        CE1414AU.add(Double.parseDouble(line));
                        break;
                }
            count++;
            }

}

编辑

我刚刚看到您的marks.txt文件的格式,在这种情况下,如果每行都用“,”分隔,那么您应该进行分割,然后在所得到的数组对象中,每个索引对应一个列表,即在这种情况下,您的get方法。

   static void get(){
     try {
        File file = new File("M:\\Documents\\ce201\\subversion\\resources\\marks.txt");
        BufferedReader br = new BufferedReader(new FileReader(file));
        String line;
        while((line = br.readLine()) != null)
        {
            String[] lineSplitted = line.split(",");
            for(int i=0; i<lineSplitted.length; i++)
            {
                switch(i)
                {
                    case 0:
                        CE1014FY.add(Double.parseDouble(lineSplitted[i]));
                        break;
                    case 1:
                        CE1014SP.add(Double.parseDouble(lineSplitted[i]));
                        break;
                    case 2:
                        CE1414AU.add(Double.parseDouble(lineSplitted[i]));
                        break;
                }
            }

        }

}

0
首先,将文件读入行数组中。 使用此 SO 问题中的方法:
public String[] readLines(String filename) throws IOException {
    FileReader fileReader = new FileReader(filename);
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    List<String> lines = new ArrayList<String>();
    String line = null;
    while ((line = bufferedReader.readLine()) != null) {
        lines.add(line);
    }
    bufferedReader.close();
    return lines.toArray(new String[lines.size()]);
}

第二步,使用this SO question将逗号分隔的行拆分为其组成部分:
String[] grades = line.split(",")

为了避免在各个地方重复使用表格,请使用enum
public enum Course {
    CE1014FY, CE1014SP, CE1414AU, CE1414FY, CE1424AU, CE1424FY, CE1514AU,
    CE1524SP, CE1534AU, CE1544SP, CE1554SP, CE1614AU, CE1624SP, CE1634AU, CE1644SP;
}

这使得不重复你的代码变得容易。

现在我们拥有了所有需要的东西:

static Map<Courses, double[]> grades = new HashMap<>();
static void get(){
    String[] lines = readLines("M:\\Documents\\ce201\\subversion\\resources\\marks.txt");
    // Init the grades map
    for(Course course: Course.values()) {
        grades.put(course, new double[lines.length]);
    }
    // Fill the grades map
    int lineNum = 0;
    for(String line: lines){
        String[] grades = line.split(",");
        int courseNum = 0;
        for(Course course: Course.values()) {
            try{
                grades.get(course)[lineNum] = Double.parseDouble(grades[courseNum++]);
            } catch(NumberFormatException nfe){
                grades.get(course)[lineNum] = -1;
                System.out.println("Error reading grade for course " + course + ", line " + lineNum + " : " + grades[courseNum-1]);
            }
        }
    }
}

然后,您可以使用以下代码获取任何课程的成绩:

double[] gradesCE1414AU = grades.get(course.CE1414AU);

编辑:鉴于您的数据没有学生姓名,我同意在所有地方使用数组,因为它们的静态性将保护排序,这是您的数据有意义的唯一保证。否则,我更喜欢(通常)具有各自Map<Course,Double> myGrades字段的Student对象列表。更符合面向对象编程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接