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

Java手动实现Set ADT时如何添加Student自定义数据类型

问题解答

疑问澄清与修正

  • 首先你现有代码的第一个问题:import java.util.HashSet和相关集合类的使用违反题目要求,题目明确禁止使用Java Collection Framework的任何类,你直接用数组存储即可,单门课程最多100人,数组完全够用,也不需要单独实现完整的Set ADT,只要在添加时判断ID是否重复就能满足Set的去重要求。
  • 关于「Set不能传入自定义Student类型」的说法是错误的,你看到的资料应该是特定场景下的限制,和本题需求无关。你自己手动实现存储逻辑的话,底层直接用Student[]类型的数组存放学生对象即可,addStudent入参为Student类型完全适配。
  • 关于getter/setter的作用域问题:因为Student是StudentCollection的静态内部类,Java语法支持外部类直接访问内部类的私有属性/私有方法,你有两种选择:
    • 不写getter/setter,直接在StudentCollection的方法中访问Student的私有属性
    • 给Student添加private的getter/setter,只有外部类StudentCollection可以调用,符合题目「除指定3个公共方法外其余方法必须为私有」的要求

核心需求实现思路

你不需要完整实现一个通用Set ADT,只要针对本题需求实现存储逻辑即可,步骤如下:

  1. 给StudentCollection定义私有成员:private Student[] students = new Student[100]; 以及 private int size = 0; 用来存储学生和记录当前学生数量
  2. 实现addStudent方法:遍历现有学生,判断是否有ID相同的,如果没有且数组未满,就把新学生加入数组,size自增
  3. 实现searchByName方法:遍历所有学生,调用String的contains方法判断学生姓名是否包含传入的name,找到第一个就返回,找不到返回null
  4. 实现rankStudent方法:先找到对应ID的学生的GPA,然后遍历所有学生统计比这个GPA高的学生数量,排名就是「高GPA人数+1」,刚好符合题目要求的并列排名规则
  5. 所有方法不要加static,题目要求是成员方法,main方法里创建StudentCollection实例调用即可

完整代码示例

public class StudentCollection {
    // 底层存储数组,最多存100个学生
    private Student[] students = new Student[100];
    // 当前存储的学生数量
    private int size = 0;

    // 内部学生类
    static class Student {
        private String ID;
        private String name;
        private double GPA;
        Student(String ID, String name, double GPA) {
            this.ID = ID;
            this.name = name;
            this.GPA = GPA;
        }
    }

    // 公共方法1:添加学生
    public void addStudent(Student std) {
        // 先判断是否已存在相同ID的学生
        for (int i = 0; i < size; i++) {
            if (students[i].ID.equals(std.ID)) {
                // 存在则直接返回不操作
                return;
            }
        }
        // 数组未满则添加
        if (size < 100) {
            students[size] = std;
            size++;
        }
    }

    // 公共方法2:按姓名搜索
    public Student searchByName(String name) {
        for (int i = 0; i < size; i++) {
            if (students[i].name.contains(name)) {
                return students[i];
            }
        }
        // 无匹配返回null
        return null;
    }

    // 公共方法3:查询学生GPA排名
    public int rankStudent(String sID) {
        // 先找到对应学生的GPA
        Double targetGpa = null;
        for (int i = 0; i < size; i++) {
            if (students[i].ID.equals(sID)) {
                targetGpa = students[i].GPA;
                break;
            }
        }
        // 没找到对应ID的学生返回-1
        if (targetGpa == null) {
            return -1;
        }
        // 统计比目标GPA高的学生数量
        int higherCount = 0;
        for (int i = 0; i < size; i++) {
            if (students[i].GPA > targetGpa) {
                higherCount++;
            }
        }
        // 排名=比他高的人数+1,刚好符合并列排名规则
        return higherCount + 1;
    }

    public static void main(String[] args) {
        // 创建集合实例
        StudentCollection collection = new StudentCollection();
        // 测试添加学生
        Student s1 = new Student("s001", "Zhang San", 9.0);
        Student s2 = new Student("s002", "Li Si", 8.5);
        Student s3 = new Student("s003", "Wang Wu", 7.0);
        Student s4 = new Student("s004", "Zhao Liu", 8.5);
        collection.addStudent(s1);
        collection.addStudent(s2);
        collection.addStudent(s3);
        collection.addStudent(s4);
        // 测试重复ID添加,不会生效
        collection.addStudent(new Student("s001", "Duplicate", 10.0));

        // 测试搜索姓名
        Student searchResult = collection.searchByName("ang");
        System.out.println("搜索姓名包含'ang'的学生ID:" + (searchResult != null ? searchResult.ID : "无匹配"));

        // 测试排名查询
        System.out.println("s001的排名:" + collection.rankStudent("s001")); // 预期1
        System.out.println("s002的排名:" + collection.rankStudent("s002")); // 预期2
        System.out.println("s003的排名:" + collection.rankStudent("s003")); // 预期4
        System.out.println("s004的排名:" + collection.rankStudent("s004")); // 预期2
        System.out.println("不存在的ID排名:" + collection.rankStudent("s999")); // 预期-1
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:06:03