Java中统计对象列表内数组成员变量元素的出现次数
统计学生课程出现次数的解决方案
针对你给出的Student类和学生列表,要统计所有课程的出现次数,我们可以通过遍历+Map计数的思路来实现,下面提供两种常用的写法:
方法一:传统循环写法(兼容所有Java版本)
这种方式逻辑直观,适合所有Java版本的项目:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class CourseCounter { public static void main(String[] args) { // 初始化学生列表(复用你给出的代码) Student a = new Student("A", new String[]{"math", "physics"}); Student b = new Student("B", new String[]{"math", "chemistry"}); Student c = new Student("C", new String[]{"physics", "chemistry"}); List<Student> students = new ArrayList<>(); students.add(a); students.add(b); students.add(c); // 初始化计数Map,key为课程名,value为出现次数 Map<String, Integer> courseCountMap = new HashMap<>(); // 遍历每个学生 for (Student student : students) { // 遍历当前学生的所有课程 for (String course : student.getClasses()) { // 更新计数:如果课程已存在则+1,否则初始化为1 courseCountMap.put(course, courseCountMap.getOrDefault(course, 0) + 1); } } // 打印结果 System.out.println("课程出现次数统计:"); for (Map.Entry<String, Integer> entry : courseCountMap.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue() + "次"); } } } // 你的Student类(补充了规范的getter和数组拷贝优化) class Student { protected final String name; protected final String[] classes; public Student(String name, String[] classes) { this.name = name; // 拷贝数组避免外部修改内部数据,保证不可变性 this.classes = classes.clone(); } // getter方法(规范的字段访问方式) public String getName() { return name; } public String[] getClasses() { // 返回数组拷贝,防止外部修改原数组 return classes.clone(); } }
运行后输出结果:
课程出现次数统计: math: 2次 physics: 2次 chemistry: 2次
方法二:Java 8+ Stream写法(简洁高效)
如果你的项目使用Java 8及以上版本,用Stream API可以让代码更简洁:
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class CourseCounterStream { public static void main(String[] args) { // 同样初始化学生列表 Student a = new Student("A", new String[]{"math", "physics"}); Student b = new Student("B", new String[]{"math", "chemistry"}); Student c = new Student("C", new String[]{"physics", "chemistry"}); List<Student> students = new ArrayList<>(); students.add(a); students.add(b); students.add(c); // 用Stream实现统计 Map<String, Long> courseCountMap = students.stream() // 把每个学生的课程数组转成流 .flatMap(student -> List.of(student.getClasses()).stream()) // 按课程分组,统计每组的数量 .collect(Collectors.groupingBy(course -> course, Collectors.counting())); // 打印结果 System.out.println("课程出现次数统计:"); courseCountMap.forEach((course, count) -> System.out.println(course + ": " + count + "次")); } }
补充说明:
- 我在
Student类里补充了数组拷贝的逻辑,这是个实用小优化:避免外部通过修改传入的classes数组影响Student对象内部的数据,保证类的不可变性。 - 如果需要按课程名排序输出,可以把
HashMap换成TreeMap,或者在Stream最后加排序逻辑。
内容的提问来源于stack exchange,提问作者dexhunter
相关产品推荐
相关产品推荐

