You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Map<String,List<String>>实现TXT文件中学生数据按班级分组

按班级分组学生数据的Java实现方案

嘿,我来帮你搞定这个把文本里的学生数据按班级分组的需求!你已经定义了Map<String, List<String>> map = new HashMap<>();,接下来咱们一步步把文本里的数据填进去~

先看看你的文本数据格式:

StudentName
Vinod
Aditya
Deepak
Pavan
Anand
Arihant
Dharmendra
Poem
ganesh
Paritosh
Paritosh

核心实现思路

我们需要读取文本文件的每一行,跳过无效的表头和分隔线,拆分出班级和学生名,再把学生名归类到对应班级的列表中。下面是完整的代码实现:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ClassStudentGrouping {
    public static void main(String[] args) {
        Map<String, List<String>> map = new HashMap<>();
        // 记得替换成你实际的文件路径
        String filePath = "students.txt";

        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            // 跳过前两行:表头和分隔线,避免把无效数据加入Map
            br.readLine();
            br.readLine();

            // 逐行读取并解析数据
            while ((line = br.readLine()) != null) {
                // 按" | "(两边带空格的竖线)拆分每行数据
                String[] parts = line.split(" \\| ");
                // 确保拆分后有班级和学生两个字段
                if (parts.length == 2) {
                    String className = parts[0].trim();
                    String studentName = parts[1].trim();

                    // 用computeIfAbsent简化逻辑:班级不存在就新建列表,存在就直接加学生
                    map.computeIfAbsent(className, k -> new ArrayList<>()).add(studentName);
                }
            }
        } catch (IOException e) {
            // 捕获文件读取异常,方便排查问题
            e.printStackTrace();
        }

        // 打印分组后的结果,验证是否正确
        map.forEach((className, students) -> {
            System.out.println("班级 " + className + " 的学生列表:");
            students.forEach(student -> System.out.println("- " + student));
        });
    }
}

关键细节说明

  • computeIfAbsent方法:这是Java 8+的实用API,完美解决了“判断班级是否存在,不存在就创建列表”的冗余代码,一行搞定添加逻辑。
  • 字符串拆分:用" \\| "作为分隔符,因为原数据里的分隔是|(两边有空格),竖线是正则特殊字符,所以要加转义符\。
  • 异常处理:用try-with-resources语法自动关闭BufferedReader,避免资源泄漏。

可选:去除重复学生名

如果想去掉重复的学生(比如示例里B班的两个Paritosh),可以把列表换成LinkedHashSet(既保证顺序又去重),最后再转回List:

import java.util.LinkedHashSet;
import java.util.Set;

// 修改临时存储的Map类型
Map<String, Set<String>> tempMap = new HashMap<>();
// 读取数据时添加到Set中自动去重
tempMap.computeIfAbsent(className, k -> new LinkedHashSet<>()).add(studentName);
// 转成你需要的Map<String, List<String>>格式
Map<String, List<String>> map = new HashMap<>();
tempMap.forEach((cls, students) -> map.put(cls, new ArrayList<>(students)));

这样处理后,每个班级的学生列表就不会有重复项啦!

内容的提问来源于stack exchange,提问作者Muli vinod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:52:53