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



>我有一个单独的.txt文件,其中有一个"学生"列表,旁边有自己的标记,从 0 到 10,下面是一个关于.txt外观的示例:

马克 2
艾伦 3
路加福音 7
艾伦 9
约翰 5
马可福音 4
艾伦 10
路加福音 1
约翰 1
约翰 7
艾伦 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来计算平均值,但实际上我不知道如何实现它......

任何帮助不胜感激!

提前感谢!

我喜欢

做这种事情的方式是使用Map s和List s。

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

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

然后,您可以制作一个 HashMap <String, List <Integer>> ,它将存储每个人的姓名和与他们关联的号码列表:

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

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

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流解决方案;在早期版本中,您可以轻松地编写一个for循环来计算它)

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

  • String#split()
  • HashMap
  • ArrayList
  • Stream<T>#mapToInt()

希望这有帮助!

编辑完整解决方案:

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

相关内容

  • 没有找到相关文章

最新更新