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个公共方法外其余方法必须为私有」的要求
- 不写getter/setter,直接在
核心需求实现思路
你不需要完整实现一个通用Set ADT,只要针对本题需求实现存储逻辑即可,步骤如下:
- 给
StudentCollection定义私有成员:private Student[] students = new Student[100];以及private int size = 0;用来存储学生和记录当前学生数量 - 实现
addStudent方法:遍历现有学生,判断是否有ID相同的,如果没有且数组未满,就把新学生加入数组,size自增 - 实现
searchByName方法:遍历所有学生,调用String的contains方法判断学生姓名是否包含传入的name,找到第一个就返回,找不到返回null - 实现
rankStudent方法:先找到对应ID的学生的GPA,然后遍历所有学生统计比这个GPA高的学生数量,排名就是「高GPA人数+1」,刚好符合题目要求的并列排名规则 - 所有方法不要加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
相关产品推荐
相关产品推荐

