0

这是我教授的模拟测试,我在用 Java 编写它时遇到了麻烦。

这是问题:

需要一个 ADT 来管理课程中的学生集合。您可以假设任何课程的学生不超过 100 人。学生的记录由 ID(字符串)、姓名(字符串)和 GPA(双精度)组成。学生 ID 没有重复,但可以有两个或多个同名和/或 GPA 的学生。

创建一个新类型 StudentCollection(它相当于 Java 中的一个类)。除构造函数外,您的 StudentCollection 类型必须支持以下 3 个公共操作(根据需要随意添加其他私有操作 - 但它们的范围必须是私有的)

void addStudent(Student std):将新的学生标准添加到您的收藏中。如果您的收藏中已经有一个学生的 ID 与 std 相同,则什么也不做。

Student searchByName(String name):搜索学生集合并返回任何名称完全包含名称的学生(区分大小写)。示例:“ABC”完全包含“ABC”;“ABC”完全包含“A”;“ABC”完全包含“C”,“ABC DEF”完全包含“C D”;“ABC”不完全包含“CB”;“ABC”不完全包含“abc”。如果有多个匹配的学生,您的方法可以返回任何学生。如果没有匹配的学生,则返回 null。int rankStudent(String sID):返回 ID 为 sID 的学生在此集合中的排名。排名是使用学生的 GPA 完成的。GPA 最高的学生排名为 1。在此示例中,假设有 4 个 GPA 值 [9.0, 8.5, 7.0, 8.5]。GPA = 9.0 的学生排名为 1,GPA = 8.5 的学生排名为 2(有 2 名学生的排名相同为 2),GPA = 7.0 的学生排名为 4。如果没有找到具有提供的 sID 的学生,则返回 -1。

创建一个 StudentCollection 对象并在 main 方法(客户端代码)中使用它。您的客户端代码必须调用所有上述 3 个公共方法一次或多次。

不允许您使用 Java 集合框架类来解决此问题。您解决此问题的代码必须存储在单个文件 StudentCollection.java 中。

我在这里选择的 ADT 是 Set。由于该指令不允许我使用 Java 集合框架,我必须手动实现所有功能。

但问题是:对于第一个函数,问题要求我写void addStudent(Student std)哪个在实现 Set ADT 时,我不能将用户定义的数据类型Student传入函数,我已经做了一些研究,我们必须传入一个 Set参数而不是用户定义的数据类型。这是学生班级的代码:

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;
        }
    }

假设我们放入了类Student,那么类中必须有一些。但是问题限制了要实现的公共功能的数量,并且除了上面三个指定功能之外的所有功能都必须是. getter 和 setter 怎么可能呢?可能吗?getters and settersStudentprivateprivate

总体问题是:如何将用户定义的数据类型添加到集合中?对不起,如果我的解释不清楚。如果您有任何其他问题,请回复此问题。

这是我一直在处理的代码:

import java.util.HashSet;
import java.util.Set;

public class StudentCollection {
    static Set<Student> manage = new HashSet<>();

    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;
        }
    }

    public static void addStudent(Student std) {
        manage.add(std);
    }

//    public static Student searchByName(String name) {
//
//    }
//
//    public static int rankStudent(String sID) {
//
//    }

    public static void main(String[] args) {

        Student std = new Student("s387", "nam", 3.7);

        addStudent(std);
       
    }
}
4

1 回答 1

1

该类Student必须是公共的,具有公共吸气剂。否则,您无法创建Student实例来添加学生。

我继续编写addStudent方法。我将剩下的代码留给你完成。

你必须检查你的课堂笔记来验证,但这就是我开始编写StudentCollection课程的方式。除了方法之外,没有静态字段或方法main

public class StudentCollection {

    public static void main(String[] args) {
        StudentCollection sc = new StudentCollection();
        sc.addStudent(sc.new Student("10001", "George", 9.0));
    }
    
    private int studentLength;
    
    private Student[] students;
    
    public StudentCollection() {
        this.studentLength = 0;
        this.students = new Student[100];
    }
    
    public void addStudent(Student student) {
        for (int index = 0; index < studentLength; index++) {
            if (student.getSID().equals(students[index].getSID())) {
                return;
            }
        }
        
        students[studentLength++] = student;
    }
    
    public Student searchByName(String name) {
        
    }
    
    public int rankStudent(String sID) {
        
    }
    
    public class Student {
        
        private final double gpa;
        
        private final String sID, name;

        public Student(String sID, String name, double gpa) {
            this.sID = sID;
            this.name = name;
            this.gpa = gpa;
        }

        public double getGpa() {
            return gpa;
        }

        public String getSID() {
            return sID;
        }

        public String getName() {
            return name;
        }
        
    }

}
于 2021-10-24T02:59:14.497 回答