从.txt文件中获取的学生列表中计算平均值

时间:2016-07-14 13:36:55

标签: java properties stream average filereader

我有一个单独的.txt文件,其中有一个"学生列表"从0到10这边有自己的标记,这里有一个关于.txt如何看的例子:

  

马克2   Elen 3
  路加7号   Elen 9
  Jhon 5
  马克4
  Elen 10
  路加1   Jhon 1
  Jhon 7
  Elen 5
  马克3
  马克7

我想要做的是计算每个学生的平均值(以double表示),以便输出看起来像这样:

Mark: 4.0
Elen: 6.75
Luke: 4.0
Jhon: 4.33

以下是我提出的问题,目前我只是设法使用Properties列出了学生姓名而没有重复,但是每个人都显示了这个名字。它们显然是该计划发现的最后一个 我已将其包含在按钮动作侦测器中,因为我正在实现GUI,按下按钮,上面显示的输出为append中的TextArea

 b1.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent d) {

   try {
      File file = new File("RegistroVoti.txt");
      FileInputStream fileInput = new FileInputStream(file);
      Properties properties = new Properties();
      properties.load(fileInput);
      fileInput.close();

      Enumeration enuKeys = properties.keys();
      while (enuKeys.hasMoreElements()) {
        String key = (String) enuKeys.nextElement();
        String value = properties.getProperty(key);
        l1.append(key + ": " + value + "\n");
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
});

我当时想用Collectors来计算平均值,但实际上我并不知道如何实现它......

感谢任何帮助!

提前致谢!

1 个答案:

答案 0 :(得分:3)

我喜欢这样做的方法是使用MapList s。

要阅读文件中的行,我非常喜欢nio阅读方式,所以我会这样做

List<String> lines = Files.readAllLines(Paths.get("RegistroVoti.txt"));

然后,您可以制作HashMap <String, List <Integer>>,其中会存储每个人的姓名以及与他们相关联的号码列表:

HashMap<String, List<Integer>> studentMarks = new HashMap<>();

然后,对每个循环使用a,遍历每一行并将每个数字添加到哈希映射中:

for (String line : lines) {
    String[] parts = line.split(" ");
    if (studentMarks.get(parts[0]) == null) {
        studentMarks.put(parts[0], new ArrayList<>());
    }
    studentMarks.get(parts[0]).add(Integer.parseInt(parts[1]));
}

然后,您可以浏览地图中的每个条目并计算相关列表的平均值:

for (String name : studentMarks.keySet()) {
    System.out.println(name + " " + studentMarks.get(name).stream().mapToInt(i -> i).average().getAsDouble());
}

(请注意,这是一个Java 8 stream解决方案;您可以轻松编写for循环来在早期版本中计算它。

有关我使用过的一些内容的详细信息,请参阅:

希望这有帮助!

修改完整的解决方案:

b1.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent d) {
        try {
            List<String> lines = Files.readAllLines(Paths.get("RegistroVoti.txt"));

            Map<String, List<Integer>> studentMarks = new HashMap<>();

            for (String line : lines) {
                String[] parts = line.split(" ");

                if (studentMarks.get(parts[0]) == null) {
                    studentMarks.put(parts[0], new ArrayList<>());
                }
                studentMarks.get(parts[0]).add(Integer.parseInt(parts[1]));
            }

            for (String name : studentMarks.keySet()) {
                System.out.println(name + " " + studentMarks.get(name).stream().mapToInt(i -> i).average().getAsDouble());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
});