如何基于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
相关产品推荐
相关产品推荐

