我正在尝试创建一个简单的预约系统来练习TDD。我最初尝试了一个ArrayList,其中有一组空格代表时间,然后是Map,两者似乎都很接近,但最终都没有。 Immutibilty是关键,我使用了一个构造函数来设置容量,并试图让setter依赖于String-value的空字符串或nullabilty(试过两者):
public class BookingSystem {
private BookingSystem bookingSystem;
private Map<Integer, String> classList;
public HashMap<Integer, String> setClassList() {
for (int i=0;i<24; i++) {
classList.put(0, "");
}
return classList;
}
public void bookClassroom(int time, String room) throws BookedException {
if (classList.get(time).equals("")) {
classList.put(time, room);
} else {
throw new BookedException();
}
}
这看起来像是一个黑客,但对我来说似乎也合乎逻辑。是一个HashMap矫枉过正,一个简单的列表或数组就足够了吗?我已经尝试了所有这些,但还没有完全打击它,现在我觉得我现在已经过多地陷入了许多Java数据结构中。
下一步是让Classrooms成为自己的类和枚举,但首先我要把基础知识搞定下来!
答案 0 :(得分:1)
嗯,这取决于预订。如果预订时段很小(预订单位是一小时,学校从上午9点到下午5点开放),那么您可以将每小时作为地图结构中的一个键。但是,如果您的预订申请使用超过一天,您必须将日期(ddmmyyyy)与地图相关联(地图&gt;)。
如果预订时间很复杂(可能是从8:20到11:10),您将拥有预订开始日期,预订结束日期和教室字段的预订实体。然后,您将在一个与预订数据库交互的方法中实现预订逻辑。该方法将检查是否有预订会与我们想要创建的预订发生冲突。如果是这种情况,该方法会引发异常;否则会创建一个新的预订。
为了更好地理解要使用的Java结构,您必须知道每个结构的特殊性。这里有一个简短的摘要here
答案 1 :(得分:0)
&#34;不变性&#34;约束使得Hashmap /表更难实现,因为你的表会变得非常臃肿。
Hashtable中的运行时间是O(1)摊销的。但是,哈希表变得太密集,导致O(N)的运行时间。我相信rehashing使这种情况非常罕见,并将运行时减少回O(1)。
如果要实现ArrayList,则运行时为O(N)最坏情况。但是,如果您知道元素的确切位置,则它是O(1)运行时。总的来说,随着预留数量的增加,使用ArrayList时,搜索/插入/删除的平均运行时间会更长。
为了提供最高效率,每次当前ArrayList填充时,您必须使用n / 2个元素来增加结构。这一开始可能看起来不是很糟糕,但是当您有大量可能的预订时会发生什么?您的资源受到严重限制。
就个人而言,我会尝试实施 AVL-Tree 。这遵循二进制搜索树属性,它将保持您的预订时间顺序,同时保持您的树平衡(节省空间和搜索/插入/删除运行时)。
AVL-Tree为搜索插入和删除提供O(log N)的运行时,为O(N)提供最坏情况的空间。随着预订数量的增加,AVL-Tree的性能明显优于ArrayList的Hashmap /表。