【问题标题】:Reading a text file of student names and text scores and finding an average读取学生姓名和文本分数的文本文件并找到平均值
【发布时间】:2013-08-11 22:11:23
【问题描述】:

目前我有存储学生姓名和考试成绩的文本文件。文件的格式是姓氏、名字和考试成绩。文本文件中的每个值都是分开的,但有一个空格。所以文件看起来像这样:

Smith John 85
Swan Emma 75

我已经运行了代码,以便将所有数据打印到控制台,但我无法让它做的是获取所有测试分数,将它们相加,然后找到平均值并打印平均值到控制台。以及打印分数低于平均分 10 分的学生。

现在这是我用来读取信息并将信息打印到控制台的代码。

public class ReadTXT 
{

public static void main(String[] args) 
{

{
    String txtFile = "/Users/Amanda/Desktop/Studentdata.txt";
BufferedReader br = null;
String line = "";
String txtSplitBy = " ";

    try {

    br = new BufferedReader(new FileReader(txtFile));
    while ((line = br.readLine()) != null) {


        String[] LastName= line.split(txtSplitBy);
                    String[] FirstName = line.split(txtSplitBy);
                    String[] TS = line.split(txtSplitBy);

        System.out.println("Last Name: " + LastName[0] 
                             + "\n" +"First Name: " + FirstName[1] + "\n" + 
                            "Test Score: " + TS [2] + "\n") ;

    {
        double average = sum / i;
    }
    }
    } catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (br != null) {
        try {
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

System.out.println("Done");

   }

  }
  }

这是我试图用来求平均值的代码。

 int i =Integer.parseInt ("TS");
double sum = 0.0;
for (int x = 0; x < i; sum += i++);
{
double average = sum / i;
}

不过,我不断收到此异常:

Exception in thread "main" java.lang.NumberFormatException: For input string: "TS"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:492)
    at java.lang.Integer.parseInt(Integer.java:527)
    at ReadTXT.main(ReadTXT.java:35)

我是学习java的新手,但我正在努力。

【问题讨论】:

  • 请向我们展示您完整的异常消息,因为它通常会告诉您(和我们)究竟出了什么问题。
  • @HovercraftFullOfEels 你在开玩笑吗?这是java.lang.NumberFormatException: "TS" is not a valid number.
  • @tbodt:我发布的不仅仅是为我们,而是为 OP,以便他们认真查看堆栈跟踪。
  • 线程“main”java.lang.NumberFormatException 中的异常:对于输入字符串:java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 处 java.lang.Integer.parseInt 处的“TS” (Integer.java:492) 在 java.lang.Integer.parseInt(Integer.java:527) 在 ReadTXT.main(ReadTXT.java:35) Java 结果:1
  • 我知道 TS 不是一个有效的数字,所以我试图将其转换为一个数字

标签: java arrays file text average


【解决方案1】:

这里的代码:

String[] LastName= line.split(txtSplitBy);
String[] FirstName = line.split(txtSplitBy);
String[] TS = line.split(txtSplitBy);

并不是真正需要的,因为您多次拆分行以创建 3 个不同的字符串数组,您要做的是将行拆分一次,然后从数组索引中分配变量,如下所示:

String[] splitLine = line.split(txtSplitBy);
String lastName = splitLine[0];  //first element of array
String firstName = splitLine[1]; //second element of array
String score = splitLine[2];     //third element of array

然后你可以将分数解析为一个字符串,这将是一个数字而不是你正在尝试的文字字符串"TS"你想要变量名,所以省略"

int i = Integer.parseInt (score);

然后,对于您的 while 循环中的每次迭代,将其加到总数中并进行计数,然后以这种方式计算您的平均值。 (或创建一个分数列表)喜欢:

int total = 0;
int count = 0;
List<Integer> allScores = new ArrayList<Integer>();
while ((line = br.readLine()) != null) 
{
    String[] splitLine = line.split(txtSplitBy);
    String lastName = splitLine[0];  //first element of array
    String firstName = splitLine[1]; //second element of array
    String score = splitLine[2];     //third element of array

    System.out.println("Last Name: " + lastName 
                         + "\n" +"First Name: " + firstname + "\n" + 
                        "Test Score: " + score + "\n") ;

    int i = Integer.parseInt (score);
    total += i;
    count++;
    // Add to List
    allScores.add(i);
}
double average = total/count;

循环列表

for( Integer i: allscores)
{
    // Do the appropriate code here
}

如果您还需要姓名,您应该创建一个类来保存名字、姓氏和分数,然后将它们添加到您的列表中。

See This Tutorial on Classes

【讨论】:

  • “分数”不是数字。
  • 现在我将如何打印比平均值低 10 的分数?
  • 你可能想要创建一个分数的ArrayList 然后循环它(见编辑)如果你还需要名称,我建议创建你自己的对象来保存名称和分数
  • 我的 ArrayList 代码应该是这样的:ArrayList scores = new ArrayList();
  • 找不到什么变量?当您将分数添加到列表时,请确保在您阅读分数时处于循环中,如我的示例所示。
【解决方案2】:

哎呀:

int i =Integer.parseInt ("TS"); 

这没有意义。 “TS”应该代表什么数字?


编辑:你说:

我知道 TS 不是一个有效的数字,这就是为什么我试图将它转换为一个数字

您不能将字母“转换”为数字,这同样没有意义。

你需要读入文件中的字符串,然后解析那些字符串,而不是你编的一些字母。


你的代码应该做的是:

  • 在 for 循环中读取文件中的每一行
  • 在此循环内,使用 String 的 split(" ") 方法拆分字符串。
  • 使用Integer.parse(...) 解析返回数组中的第三项。

那么我会使用 Integer.parse(String [] TS) 吗?

不,这甚至无法编译,因为您试图将 String 数组传递给采用 String 参数的方法。

【讨论】:

  • TS代表考试成绩
  • 那么如何获取存储在 TS 中的字符串值并将其用作整数以便求平均值?
  • @user2603112:您需要解析文件中保存的数据。 "TS" 是字符串,不是文件。
  • 那么我会使用 Integer.parse(String [] TS) 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
相关资源
最近更新 更多