Java 删除课程时删除时段时出现问题

Java 删除课程时删除时段时出现问题,java,arraylist,static,Java,Arraylist,Static,我正在为一个班级项目创建一个时间表和注册系统。我需要能够添加和删除房间和课程。每门课程只能持续一个小时,不能与同一房间内的另一门课程同时进行。我可以删除课程本身,但删除与该课程相关的时间时遇到问题 我所做的是创建一个房间的ArrayList,每个房间都可以容纳一个课程的ArrayList。这些课程中的每一门都有一个特定的小时,使用ArrayList的时间来检查它是否在使用中。我能够将课程时间添加到列表中,并阻止用户在同一房间创建另一个具有确切时间段的课程。但是,每当我删除课程时,我也会尝试删除时

我正在为一个班级项目创建一个时间表和注册系统。我需要能够添加和删除房间和课程。每门课程只能持续一个小时,不能与同一房间内的另一门课程同时进行。我可以删除课程本身,但删除与该课程相关的时间时遇到问题

我所做的是创建一个房间的ArrayList,每个房间都可以容纳一个课程的ArrayList。这些课程中的每一门都有一个特定的小时,使用ArrayList的时间来检查它是否在使用中。我能够将课程时间添加到列表中,并阻止用户在同一房间创建另一个具有确切时间段的课程。但是,每当我删除课程时,我也会尝试删除时间,以便创建的另一个课程可以使用该时间段。问题是,即使在取消课程后,时间段也会被填满,并且一直保持填满状态,我不知道为什么

一些准则:
  • 用户可以添加和删除房间。(若要删除教室,不应在此教室中安排任何课程)
  • 用户可以删除所有课程
  • 用户可以通过指定房间号和参与者来创建课程
  • 一个房间在任何一个小时的时段内不能容纳超过一门课程
  • 老实说,我已经连续工作了7个小时左右,我对自己的代码没有信心,即使我做得对,或者我说的是真的。我很抱歉,如果我不够具体或没有任何意义,请让我知道,如果有什么需要澄清。如果您有任何其他提示/指示或看到任何其他错误,请告诉我。提前谢谢

    Course.java

    package Schedule;
    
    import java.util.ArrayList;
    
    public class Course extends Room {
    
      private String name;
      private int roomNum, hour, students;
      private static ArrayList < Course > courseList = new ArrayList < > ();
      private static ArrayList < Integer > times = new ArrayList < > (24);
    
      public Course() {}
    
      public Course(String name, int hour, int roomNum, int students) { //Constructor
        this.name = name;
    
        if (hour > 7 && hour < 18) {
          this.hour = hour;
        } else {
          System.out.println("Not a valid time slot. Time set to 6:00PM/1800 HOURS. ");
          this.hour = 18;
        }
    
        this.students = students;
        this.roomNum = roomNum;
    
        boolean inUse = checkTime(hour, roomNum);
        if (inUse == false) {
          times.add(hour);
          Room.addCourse(roomNum, this);
          courseList.add(this);
        }
      }
    
      public static void deleteCourse(int courseNum, int roomNum) {
        boolean pass;
        pass = Room.removeCourse(courseNum, roomNum);
    
        if (pass == true) {
          times.remove(courseNum);
          courseList.remove(courseNum);
          System.out.println("Course Removed ");
        }
      }
    
      public static boolean checkTime(int hour, int roomNum) {
        boolean exist = false;
    
        for (int i = 0; i < courseList.size(); i++) {
          if (courseList.get(i).hour == hour && courseList.get(i).roomNum == roomNum) {
            exist = true;
    
            System.out.println("Time already in use, course could not be added. ");
          }
        }
    
        return exist;
      }
    }
    
    输出:

    Room added
    Room added
    Room added
    Course added to room 3
    Course added to room 99
    Course Removed 
    Time already in use, course could not be added. 
    Room 56 does not exist, could not delete.
    Room 99 Deleted
    Could not find course to delete. 
    BUILD SUCCESSFUL (total time: 0 seconds)
    
    更新:

    我设法通过完全删除课程和房间号来解决问题,而是传递了课程名称。由于我传递了每门课程的索引(courseNum),我最终删除了错误的课程,这就是为什么我的时代没有正确删除的原因。通过在我的课程列表和我的房间课程列表中搜索课程名称,我能够准确地从两个列表中删除正确的课程。这是我修好的

    主要
    course1=新课程(“Course2”、9、99、12)//创建课程2和时间段
    课程。删除课程(“课程2”)//删除课程2和时间段
    课程2=新课程(“帮助”,9、99、122)//将课程帮助添加到同一小时
    /*
    新产量
    99号房间增加了课程
    课程取消
    99号房间增加了课程
    
    */
    我认为主要问题是您正在使用索引删除课程列表。我认为你假设RoomNum 99与课程Num 0相关联。事实上,您的申请中没有课程号的概念。默认情况下,它将成为列表的索引

     private static ArrayList < Course > courseList = new ArrayList < > ();
     courseList.add(object of type Course);
    
     courseList.remove(courseNum); // Note course Num becomes an index here
    
    private static ArrayListcourseList=new ArrayList<>();
    courseList.add(类型为Course的对象);
    courseList.remove(courseNum);//注意,course Num在这里成为一个索引
    
    因此,这将删除错误的条目。99号房间的Course2仍保留在列表中,因此表示课程仍在运行


    编辑:如果你必须记住课程编号和课程名称之间的关系,这种设计非常混乱,并且不起作用。您没有在设计中的任何地方对关系进行建模。

    当您声明某个
    静态
    时,它会使成员属于类而不是实例。因此,在运行程序时,让我们看看ArrayList的内容

    Room room0 = new Room(0, 1);
    Room room1 = new Room(3, 1);
    Room room2 = new Room(99, 1);
    Course course0 = new Course("Course", 9, 3, 10);
    // courseList : {course0} | hours : {9}
    Course course1 = new Course("Course2", 9, 99, 12);
    // courseList : {course0,course1} | hours : {9,9}
    Course.deleteCourse(0, 99);
    // courseList : {course1} | hours : {9}
    

    由于Arraylist是静态的,因此
    deleteCourse
    方法不会删除99房间的课程0。它会将course1从您的房间courseList中删除,但不会从
    静态
    数组列表中删除

    这不是原因。原因是它删除了索引为0的课程,它是课程而不是课程2。如果您看到课程。删除课程(0,99),则作者正在尝试删除99号房间中运行的课程。这不会像我上面解释的那样起作用。这正是我所说的。事实上,没有什么比课程0更好的了。他假设Course 0是Course 2对应的数组位置,因此与房间99相关。这是不正确的。所以如果你重新排序,课程0=新课程(“课程”,9,3,10);课程1=新课程(“课程2”,9,99,12);你可以插入帮助。我明白了,我想如果我能跟踪数组中每个课程的索引位置,那就不会有问题了。我将尝试使用搜索课程的特定名称来删除课程。谢谢太好了。我很高兴它帮助了你。然而,考虑一下这一点——尝试为一个课程指定一个独特的课程ID,而不是像CS101这样的名字。将时间和容量直接与每个房间联系起来,并编写一个函数来安排一段时间的课程,以查看哪些房间按容量顺序可用。
     private static ArrayList < Course > courseList = new ArrayList < > ();
     courseList.add(object of type Course);
    
     courseList.remove(courseNum); // Note course Num becomes an index here
    
    Room room0 = new Room(0, 1);
    Room room1 = new Room(3, 1);
    Room room2 = new Room(99, 1);
    Course course0 = new Course("Course", 9, 3, 10);
    // courseList : {course0} | hours : {9}
    Course course1 = new Course("Course2", 9, 99, 12);
    // courseList : {course0,course1} | hours : {9,9}
    Course.deleteCourse(0, 99);
    // courseList : {course1} | hours : {9}