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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:50:49