2013-05-05 88 views
0

我是一个初学者在java,我很努力让这个代码工作。我正在尝试读取CSV文件,然后使用该数据计算平均值,然后返回最高平均值和最高平均值的摘要。Java阅读文件/扫描器

输入如下:

艾丽西亚商标,89,90,100,95,75,85,94,100,90,92

鲍比·里克斯,98,79,87,79,9 ,98,7,19,98,78

这里是放出来应该是什么样子(数字是不正确的,例如只):

艾丽西亚商标85.5乙

鲍比·里克斯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循环,但我不是太确定了。任何帮助解决这个问题将非常感激。

+2

你告诉我们你的需求,你告诉我们的代码,但你不要告诉我们你的代码有什么问题,这使我们很难帮助你。请告诉我们您的代码出了什么问题,它的行为不正确。 – 2013-05-05 19:47:21

+0

为什么你'av = new ArrayList ();'在每次迭代?把它放在'while'循环之外。 – Maroun 2013-05-05 19:51:43

+1

'这就是外观应该看起来像什么,但它看起来像什么? – 2013-05-05 19:52:51

回答

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(); 
     } 
    } 
} 
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