如何只读取Java中的部分文本文件?

时间:2018-01-24 23:23:05

标签: java file-io

所以我有一个包含作业成绩的文本文件。

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

2 个答案:

答案 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等做类似的事情。