所以我有一个包含作业成绩的文本文件。
LABS
100
90
90
90
90
85
80
HOMEWORK
100
100
0
100
100
50
我已经编写了成功读取文件的代码,但现在我试图找到实验室和家庭作业成绩的平均值。我如何才能这样做才能读取某些行,这样我只能取实验等级或只能将作业等级取平均值?我需要一个阵列吗?
import java.util.Scanner;
import java.io.*;
public class FinalGradeCalculator {
//Read from file
public static void main(String[] args) {
String fileName = "grades.txt";
Scanner fileScanner = null;//Initialize fileScanner
System.out.println("The file " + fileName + " contains the following lines:\n");
try
{
fileScanner = new Scanner(new File(fileName));
}
catch(Exception e)
{
System.out.println(e);
}
while(fileScanner.hasNextLine())
{
String fileLine = fileScanner.nextLine();
System.out.println(fileLine);
}
fileScanner.close();
}
}
答案 0 :(得分:0)
使用ArrayList
并在“LABS”之后和“家庭作业”之前添加所有行,然后使用IntStream#sum
组合数字并除以List#size
以获得平均值:
ArrayList<Integer> labs = new ArrayList<Integer>();
while (fileScanner.hasNextLine()) {
String fileLine = fileScanner.nextLine();
if (fileLine.equalsIgnoreCase("labs"))
continue;
if (fileLine.equalsIgnoreCase("homework"))
break;
labs.add(Integer.parseInt(fileLine));
}
fileScanner.close();
System.out.println("Labs average: " + labs.stream().mapToInt(i -> i).sum()/labs.size());
答案 1 :(得分:0)
我个人更喜欢避免硬编码。由于你的案例正在寻找一个数字,并且想要避免一般的话,你可以这样做:
ArrayList<Integer> marks = new ArrayList<Integer>();
while (fileScanner.hasNextLine()) {
String fileLine = fileScanner.nextLine();
if (isInteger(fileLine)){
marks.add(Integer.parseInt(fileLine));
}
}
}
fileScanner.close();
System.out.println("Labs average: " + marks.stream().mapToInt(i -> i).sum()/marks.size());
其中isInteger()如下:
public static boolean isInteger(String s) {
boolean isValidInteger = false;
try
{
Integer.parseInt(s);
// s is a valid integer
isValidInteger = true;
}
catch (NumberFormatException ex)
{
// s is not an integer
}
return isValidInteger;
}
}
你可以为Float等做类似的事情。